[lld] r371398 - [ELF] nmagic or omagic: don't allocate PT_PHDR or PF_R PT_LOAD for the !hasPhdrsCommands case

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 9 06:08:52 PDT 2019


Author: maskray
Date: Mon Sep  9 06:08:51 2019
New Revision: 371398

URL: http://llvm.org/viewvc/llvm-project?rev=371398&view=rev
Log:
[ELF] nmagic or omagic: don't allocate PT_PHDR or PF_R PT_LOAD for the !hasPhdrsCommands case

```
part.phdrs = script->hasPhdrsCommands() ? script->createPhdrs() : createPhdrs(part);
```

createPhdrs() allocates a PT_PHDR and a PF_R PT_LOAD, which will be
deleted later in LinkerScript::allocateHeaders, but leave a gap between
the program headers and the first section. Don't allocate the segments
to avoid the gap. PT_INTERP is likely not needed as well.

Reviewed By: ruiu

Differential Revision: https://reviews.llvm.org/D67324

Modified:
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/ELF/magic-page-combo-warn.s
    lld/trunk/test/ELF/nmagic.s
    lld/trunk/test/ELF/relro-omagic.s
    lld/trunk/test/ELF/segments.s

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=371398&r1=371397&r2=371398&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Mon Sep  9 06:08:51 2019
@@ -2030,27 +2030,32 @@ std::vector<PhdrEntry *> Writer<ELFT>::c
   unsigned partNo = part.getNumber();
   bool isMain = partNo == 1;
 
-  // The first phdr entry is PT_PHDR which describes the program header itself.
-  if (isMain)
-    addHdr(PT_PHDR, PF_R)->add(Out::programHeaders);
-  else
-    addHdr(PT_PHDR, PF_R)->add(part.programHeaders->getParent());
-
-  // PT_INTERP must be the second entry if exists.
-  if (OutputSection *cmd = findSection(".interp", partNo))
-    addHdr(PT_INTERP, cmd->getPhdrFlags())->add(cmd);
-
   // Add the first PT_LOAD segment for regular output sections.
   uint64_t flags = computeFlags(PF_R);
   PhdrEntry *load = nullptr;
 
-  // Add the headers. We will remove them if they don't fit.
-  // In the other partitions the headers are ordinary sections, so they don't
-  // need to be added here.
-  if (isMain) {
-    load = addHdr(PT_LOAD, flags);
-    load->add(Out::elfHeader);
-    load->add(Out::programHeaders);
+  // nmagic or omagic output does not have PT_PHDR, PT_INTERP, or the readonly
+  // PT_LOAD.
+  if (!config->nmagic && !config->omagic) {
+    // The first phdr entry is PT_PHDR which describes the program header
+    // itself.
+    if (isMain)
+      addHdr(PT_PHDR, PF_R)->add(Out::programHeaders);
+    else
+      addHdr(PT_PHDR, PF_R)->add(part.programHeaders->getParent());
+
+    // PT_INTERP must be the second entry if exists.
+    if (OutputSection *cmd = findSection(".interp", partNo))
+      addHdr(PT_INTERP, cmd->getPhdrFlags())->add(cmd);
+
+    // Add the headers. We will remove them if they don't fit.
+    // In the other partitions the headers are ordinary sections, so they don't
+    // need to be added here.
+    if (isMain) {
+      load = addHdr(PT_LOAD, flags);
+      load->add(Out::elfHeader);
+      load->add(Out::programHeaders);
+    }
   }
 
   // PT_GNU_RELRO includes all sections that should be marked as

Modified: lld/trunk/test/ELF/magic-page-combo-warn.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/magic-page-combo-warn.s?rev=371398&r1=371397&r2=371398&view=diff
==============================================================================
--- lld/trunk/test/ELF/magic-page-combo-warn.s (original)
+++ lld/trunk/test/ELF/magic-page-combo-warn.s Mon Sep  9 06:08:51 2019
@@ -13,7 +13,7 @@
 
 # OMAGIC:     ProgramHeader {
 # OMAGIC:      Type: PT_LOAD
-# OMAGIC-NEXT:   Offset: 0xE8
+# OMAGIC-NEXT:   Offset: 0xB0
 # OMAGIC-NEXT:   VirtualAddress:
 # OMAGIC-NEXT:   PhysicalAddress:
 # OMAGIC-NEXT:   FileSize:
@@ -23,7 +23,7 @@
 # OMAGIC-NEXT:     PF_W
 # OMAGIC-NEXT:     PF_X
 # OMAGIC-NEXT:   ]
-# OMAGIC-NEXT:   Alignment: 8
+# OMAGIC-NEXT:   Alignment: 4
 # OMAGIC-NEXT: }
 # OMAGIC-NEXT: ProgramHeader {
 # OMAGIC-NEXT:   Type: PT_GNU_STACK
@@ -35,7 +35,7 @@
 
 # NMAGIC:   ProgramHeader {
 # NMAGIC-NEXT:     Type: PT_LOAD
-# NMAGIC-NEXT:     Offset: 0x158
+# NMAGIC-NEXT:     Offset: 0x120
 # NMAGIC-NEXT:     VirtualAddress:
 # NMAGIC-NEXT:     PhysicalAddress:
 # NMAGIC-NEXT:     FileSize: 1
@@ -43,11 +43,11 @@
 # NMAGIC-NEXT:     Flags [
 # NMAGIC-NEXT:       PF_R
 # NMAGIC-NEXT:     ]
-# NMAGIC-NEXT:     Alignment: 8
+# NMAGIC-NEXT:     Alignment: 1
 # NMAGIC-NEXT:   }
 # NMAGIC-NEXT:   ProgramHeader {
 # NMAGIC-NEXT:     Type: PT_LOAD
-# NMAGIC-NEXT:     Offset: 0x15C
+# NMAGIC-NEXT:     Offset: 0x124
 # NMAGIC-NEXT:     VirtualAddress:
 # NMAGIC-NEXT:     PhysicalAddress:
 # NMAGIC-NEXT:     FileSize: 2
@@ -60,7 +60,7 @@
 # NMAGIC-NEXT:   }
 # NMAGIC-NEXT:   ProgramHeader {
 # NMAGIC-NEXT:     Type: PT_LOAD (0x1)
-# NMAGIC-NEXT:     Offset: 0x15E
+# NMAGIC-NEXT:     Offset: 0x126
 # NMAGIC-NEXT:     VirtualAddress:
 # NMAGIC-NEXT:     PhysicalAddress:
 # NMAGIC-NEXT:     FileSize: 1

Modified: lld/trunk/test/ELF/nmagic.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/nmagic.s?rev=371398&r1=371397&r2=371398&view=diff
==============================================================================
--- lld/trunk/test/ELF/nmagic.s (original)
+++ lld/trunk/test/ELF/nmagic.s Mon Sep  9 06:08:51 2019
@@ -6,12 +6,12 @@
 # RUN: llvm-readelf --section-headers %t.exe | FileCheck %s
 
 # CHECK: [ 0]           NULL     00000000 000000 000000 00      0   0  0
-# CHECK: [ 1] .text     PROGBITS 00000000 0000d4 000001 00  AX  0   0  4
-# CHECK: [ 2] .rodata   PROGBITS 00000008 0000d8 000008 00   A  0   0  8
-# CHECK: [ 3] .comment  PROGBITS 00000000 0000e0 000008 01  MS  0   0  1
-# CHECK: [ 4] .symtab   SYMTAB   00000000 0000e8 000020 10      6   1  4
-# CHECK: [ 5] .shstrtab STRTAB   00000000 000108 000032 00      0   0  1
-# CHECK: [ 6] .strtab   STRTAB   00000000 00013a 000008 00      0   0  1
+# CHECK: [ 1] .text     PROGBITS 00000000 000094 000001 00  AX  0   0  4
+# CHECK: [ 2] .rodata   PROGBITS 00000008 000098 000008 00   A  0   0  8
+# CHECK: [ 3] .comment  PROGBITS 00000000 0000a0 000008 01  MS  0   0  1
+# CHECK: [ 4] .symtab   SYMTAB   00000000 0000a8 000020 10      6   1  4
+# CHECK: [ 5] .shstrtab STRTAB   00000000 0000c8 000032 00      0   0  1
+# CHECK: [ 6] .strtab   STRTAB   00000000 0000fa 000008 00      0   0  1
 
 .globl _start
 .text

Modified: lld/trunk/test/ELF/relro-omagic.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relro-omagic.s?rev=371398&r1=371397&r2=371398&view=diff
==============================================================================
--- lld/trunk/test/ELF/relro-omagic.s (original)
+++ lld/trunk/test/ELF/relro-omagic.s Mon Sep  9 06:08:51 2019
@@ -9,18 +9,18 @@
 # NORELRO:      Sections:
 # NORELRO-NEXT: Idx Name          Size     VMA              Type
 # NORELRO-NEXT:   0               00000000 0000000000000000
-# NORELRO-NEXT:   1 .dynsym       00000048 0000000000200120
-# NORELRO-NEXT:   2 .hash         00000020 0000000000200168
-# NORELRO-NEXT:   3 .dynstr       00000021 0000000000200188
-# NORELRO-NEXT:   4 .rela.dyn     00000018 00000000002001b0
-# NORELRO-NEXT:   5 .rela.plt     00000018 00000000002001c8
-# NORELRO-NEXT:   6 .text         0000000a 00000000002001e0 TEXT
-# NORELRO-NEXT:   7 .plt          00000020 00000000002001f0 TEXT
-# NORELRO-NEXT:   8 .data         00000008 0000000000200210 DATA
-# NORELRO-NEXT:   9 .foo          00000004 0000000000200218 DATA
-# NORELRO-NEXT:  10 .dynamic      000000f0 0000000000200220
-# NORELRO-NEXT:  11 .got          00000008 0000000000200310 DATA
-# NORELRO-NEXT:  12 .got.plt      00000020 0000000000200318 DATA
+# NORELRO-NEXT:   1 .dynsym       00000048 00000000002000e8
+# NORELRO-NEXT:   2 .hash         00000020 0000000000200130
+# NORELRO-NEXT:   3 .dynstr       00000021 0000000000200150
+# NORELRO-NEXT:   4 .rela.dyn     00000018 0000000000200178
+# NORELRO-NEXT:   5 .rela.plt     00000018 0000000000200190
+# NORELRO-NEXT:   6 .text         0000000a 00000000002001a8 TEXT
+# NORELRO-NEXT:   7 .plt          00000020 00000000002001c0 TEXT
+# NORELRO-NEXT:   8 .data         00000008 00000000002001e0 DATA
+# NORELRO-NEXT:   9 .foo          00000004 00000000002001e8 DATA
+# NORELRO-NEXT:  10 .dynamic      000000f0 00000000002001f0
+# NORELRO-NEXT:  11 .got          00000008 00000000002002e0 DATA
+# NORELRO-NEXT:  12 .got.plt      00000020 00000000002002e8 DATA
 
 # NOPHDRS:     ProgramHeaders [
 # NOPHDRS-NOT: PT_GNU_RELRO

Modified: lld/trunk/test/ELF/segments.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/segments.s?rev=371398&r1=371397&r2=371398&view=diff
==============================================================================
--- lld/trunk/test/ELF/segments.s (original)
+++ lld/trunk/test/ELF/segments.s Mon Sep  9 06:08:51 2019
@@ -84,7 +84,7 @@
 
 # OMAGIC:     ProgramHeader {
 # OMAGIC:      Type: PT_LOAD
-# OMAGIC-NEXT:   Offset: 0xE8
+# OMAGIC-NEXT:   Offset: 0xB0
 # OMAGIC-NEXT:   VirtualAddress:
 # OMAGIC-NEXT:   PhysicalAddress:
 # OMAGIC-NEXT:   FileSize:
@@ -94,7 +94,7 @@
 # OMAGIC-NEXT:     PF_W
 # OMAGIC-NEXT:     PF_X
 # OMAGIC-NEXT:   ]
-# OMAGIC-NEXT:   Alignment: 8
+# OMAGIC-NEXT:   Alignment: 4
 # OMAGIC-NEXT: }
 # OMAGIC-NEXT: ProgramHeader {
 # OMAGIC-NEXT:   Type: PT_GNU_STACK
@@ -106,7 +106,7 @@
 
 # NMAGIC:   ProgramHeader {
 # NMAGIC-NEXT:     Type: PT_LOAD
-# NMAGIC-NEXT:     Offset: 0x158
+# NMAGIC-NEXT:     Offset: 0x120
 # NMAGIC-NEXT:     VirtualAddress:
 # NMAGIC-NEXT:     PhysicalAddress:
 # NMAGIC-NEXT:     FileSize: 1
@@ -114,11 +114,11 @@
 # NMAGIC-NEXT:     Flags [
 # NMAGIC-NEXT:       PF_R
 # NMAGIC-NEXT:     ]
-# NMAGIC-NEXT:     Alignment: 8
+# NMAGIC-NEXT:     Alignment: 1
 # NMAGIC-NEXT:   }
 # NMAGIC-NEXT:   ProgramHeader {
 # NMAGIC-NEXT:     Type: PT_LOAD
-# NMAGIC-NEXT:     Offset: 0x15C
+# NMAGIC-NEXT:     Offset: 0x124
 # NMAGIC-NEXT:     VirtualAddress:
 # NMAGIC-NEXT:     PhysicalAddress:
 # NMAGIC-NEXT:     FileSize: 2
@@ -131,7 +131,7 @@
 # NMAGIC-NEXT:   }
 # NMAGIC-NEXT:   ProgramHeader {
 # NMAGIC-NEXT:     Type: PT_LOAD (0x1)
-# NMAGIC-NEXT:     Offset: 0x15E
+# NMAGIC-NEXT:     Offset: 0x126
 # NMAGIC-NEXT:     VirtualAddress:
 # NMAGIC-NEXT:     PhysicalAddress:
 # NMAGIC-NEXT:     FileSize: 1




More information about the llvm-commits mailing list