summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-10-09 15:31:49 +0000
committerRui Ueyama <ruiu@google.com>2015-10-09 15:31:49 +0000
commitbf3fd7c9a0f359758fc929cfb33708693c4f2aeb (patch)
tree4a6138229876d593e40e2b53a65dc25478f4212b
parent18af8a20c554a4a5cfe90e1c301c6b509cc3e844 (diff)
downloadbcm5719-llvm-bf3fd7c9a0f359758fc929cfb33708693c4f2aeb.tar.gz
bcm5719-llvm-bf3fd7c9a0f359758fc929cfb33708693c4f2aeb.zip
ELF2: Emit a PT_PHDR header as the first entry of the program header.
PT_PHDR entry points to the program header itself. llvm-svn: 249839
-rw-r--r--lld/ELF/Writer.cpp12
-rw-r--r--lld/test/elf2/basic-aarch64.s18
-rw-r--r--lld/test/elf2/basic-mips.s14
-rw-r--r--lld/test/elf2/basic.s18
-rw-r--r--lld/test/elf2/basic32.s18
-rw-r--r--lld/test/elf2/basic32be.s18
-rw-r--r--lld/test/elf2/basic64be.s18
-rw-r--r--lld/test/elf2/emulation.s8
-rw-r--r--lld/test/elf2/program-header-layout.s12
-rw-r--r--lld/test/elf2/shared.s5
10 files changed, 118 insertions, 23 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 0688a5bf28b..832357462cb 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -103,6 +103,7 @@ private:
llvm::BumpPtrAllocator PAlloc;
SymbolTable &Symtab;
std::vector<ProgramHeader<ELFT> *> PHDRs;
+ ProgramHeader<ELFT> PhdrPHDR{PT_PHDR, PF_R, 0, 0};
ProgramHeader<ELFT> FileHeaderPHDR{PT_LOAD, PF_R, 0, 0};
ProgramHeader<ELFT> InterpPHDR{PT_INTERP, 0, 0, 0};
ProgramHeader<ELFT> DynamicPHDR{PT_DYNAMIC, 0, 0, 0};
@@ -501,6 +502,13 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
FileOff += sizeof(Elf_Ehdr);
VA += sizeof(Elf_Ehdr);
+ // The first PHDR entry is PT_PHDR which describes the program header itself.
+ PHDRs.push_back(&PhdrPHDR);
+ PhdrPHDR.Header.p_align = 8;
+ PhdrPHDR.Header.p_offset = FileOff;
+ PhdrPHDR.Header.p_vaddr = VA;
+ PhdrPHDR.Header.p_paddr = VA;
+
// Reserve space for PHDRs.
ProgramHeaderOff = FileOff;
FileOff = RoundUpToAlignment(FileOff, Target->getPageSize());
@@ -558,6 +566,10 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
FileOff += OffsetToAlignment(FileOff, ELFT::Is64Bits ? 8 : 4);
+ // Fix up the first entry's size.
+ PhdrPHDR.Header.p_filesz = sizeof(Elf_Phdr) * PHDRs.size();
+ PhdrPHDR.Header.p_memsz = sizeof(Elf_Phdr) * PHDRs.size();
+
// Add space for section headers.
SectionHeaderOff = FileOff;
FileOff += getNumSections() * sizeof(Elf_Shdr);
diff --git a/lld/test/elf2/basic-aarch64.s b/lld/test/elf2/basic-aarch64.s
index f82af4bcb88..a401da80d6a 100644
--- a/lld/test/elf2/basic-aarch64.s
+++ b/lld/test/elf2/basic-aarch64.s
@@ -31,7 +31,7 @@ _start:
# CHECK-NEXT: ]
# CHECK-NEXT: HeaderSize: 64
# CHECK-NEXT: ProgramHeaderEntrySize: 56
-# CHECK-NEXT: ProgramHeaderCount: 2
+# CHECK-NEXT: ProgramHeaderCount: 3
# CHECK-NEXT: SectionHeaderEntrySize: 64
# CHECK-NEXT: SectionHeaderCount: 6
# CHECK-NEXT: StringTableSectionIndex: 5
@@ -159,12 +159,24 @@ _start:
# CHECK-NEXT: ]
# CHECK-NEXT: ProgramHeaders [
# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_PHDR (0x6)
+# CHECK-NEXT: Offset: 0x40
+# CHECK-NEXT: VirtualAddress: 0x400040
+# CHECK-NEXT: PhysicalAddress: 0x400040
+# CHECK-NEXT: FileSize: 168
+# CHECK-NEXT: MemSize: 168
+# CHECK-NEXT: Flags [ (0x4)
+# CHECK-NEXT: PF_R (0x4)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 8
+# CHECK-NEXT: }
+# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_LOAD (0x1)
# CHECK-NEXT: Offset: 0x0
# CHECK-NEXT: VirtualAddress: 0x400000
# CHECK-NEXT: PhysicalAddress: 0x400000
-# CHECK-NEXT: FileSize: 176
-# CHECK-NEXT: MemSize: 176
+# CHECK-NEXT: FileSize: 232
+# CHECK-NEXT: MemSize: 232
# CHECK-NEXT: Flags [
# CHECK-NEXT: PF_R
# CHECK-NEXT: ]
diff --git a/lld/test/elf2/basic-mips.s b/lld/test/elf2/basic-mips.s
index 33a2bddc176..5e2a157a160 100644
--- a/lld/test/elf2/basic-mips.s
+++ b/lld/test/elf2/basic-mips.s
@@ -32,7 +32,7 @@ __start:
# CHECK-NEXT: ]
# CHECK-NEXT: HeaderSize: 52
# CHECK-NEXT: ProgramHeaderEntrySize: 32
-# CHECK-NEXT: ProgramHeaderCount: 2
+# CHECK-NEXT: ProgramHeaderCount: 3
# CHECK-NEXT: SectionHeaderEntrySize: 40
# CHECK-NEXT: SectionHeaderCount: 8
# CHECK-NEXT: StringTableSectionIndex: 7
@@ -181,6 +181,18 @@ __start:
# CHECK-NEXT: ]
# CHECK-NEXT: ProgramHeaders [
# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_PHDR (0x6)
+# CHECK-NEXT: Offset: 0x34
+# CHECK-NEXT: VirtualAddress: 0x400034
+# CHECK-NEXT: PhysicalAddress: 0x400034
+# CHECK-NEXT: FileSize: 96
+# CHECK-NEXT: MemSize: 96
+# CHECK-NEXT: Flags [ (0x4)
+# CHECK-NEXT: PF_R (0x4)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 8
+# CHECK-NEXT: }
+# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_LOAD (0x1)
# CHECK-NEXT: Offset: 0x0
# CHECK-NEXT: VirtualAddress: 0x400000
diff --git a/lld/test/elf2/basic.s b/lld/test/elf2/basic.s
index 4dc64b2cdeb..e1bc067b524 100644
--- a/lld/test/elf2/basic.s
+++ b/lld/test/elf2/basic.s
@@ -32,7 +32,7 @@ _start:
# CHECK-NEXT: ]
# CHECK-NEXT: HeaderSize: 64
# CHECK-NEXT: ProgramHeaderEntrySize: 56
-# CHECK-NEXT: ProgramHeaderCount: 2
+# CHECK-NEXT: ProgramHeaderCount: 3
# CHECK-NEXT: SectionHeaderEntrySize: 64
# CHECK-NEXT: SectionHeaderCount: 6
# CHECK-NEXT: StringTableSectionIndex: 5
@@ -151,12 +151,24 @@ _start:
# CHECK-NEXT: ]
# CHECK-NEXT: ProgramHeaders [
# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_PHDR (0x6)
+# CHECK-NEXT: Offset: 0x40
+# CHECK-NEXT: VirtualAddress: 0x10040
+# CHECK-NEXT: PhysicalAddress: 0x10040
+# CHECK-NEXT: FileSize: 168
+# CHECK-NEXT: MemSize: 168
+# CHECK-NEXT: Flags [ (0x4)
+# CHECK-NEXT: PF_R (0x4)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 8
+# CHECK-NEXT: }
+# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_LOAD (0x1)
# CHECK-NEXT: Offset: 0x0
# CHECK-NEXT: VirtualAddress: 0x10000
# CHECK-NEXT: PhysicalAddress: 0x10000
-# CHECK-NEXT: FileSize: 176
-# CHECK-NEXT: MemSize: 176
+# CHECK-NEXT: FileSize: 232
+# CHECK-NEXT: MemSize: 232
# CHECK-NEXT: Flags [
# CHECK-NEXT: PF_R
# CHECK-NEXT: ]
diff --git a/lld/test/elf2/basic32.s b/lld/test/elf2/basic32.s
index 94ee394f21b..28501e79f73 100644
--- a/lld/test/elf2/basic32.s
+++ b/lld/test/elf2/basic32.s
@@ -30,7 +30,7 @@ _start:
# CHECK-NEXT: ]
# CHECK-NEXT: HeaderSize: 52
# CHECK-NEXT: ProgramHeaderEntrySize: 32
-# CHECK-NEXT: ProgramHeaderCount: 2
+# CHECK-NEXT: ProgramHeaderCount: 3
# CHECK-NEXT: SectionHeaderEntrySize: 40
# CHECK-NEXT: SectionHeaderCount: 6
# CHECK-NEXT: StringTableSectionIndex: 5
@@ -129,12 +129,24 @@ _start:
# CHECK-NEXT: ]
# CHECK-NEXT: ProgramHeaders [
# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_PHDR (0x6)
+# CHECK-NEXT: Offset: 0x34
+# CHECK-NEXT: VirtualAddress: 0x10034
+# CHECK-NEXT: PhysicalAddress: 0x10034
+# CHECK-NEXT: FileSize: 96
+# CHECK-NEXT: MemSize: 96
+# CHECK-NEXT: Flags [ (0x4)
+# CHECK-NEXT: PF_R (0x4)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 8
+# CHECK-NEXT: }
+# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_LOAD (0x1)
# CHECK-NEXT: Offset: 0x0
# CHECK-NEXT: VirtualAddress: 0x10000
# CHECK-NEXT: PhysicalAddress: 0x10000
-# CHECK-NEXT: FileSize: 116
-# CHECK-NEXT: MemSize: 116
+# CHECK-NEXT: FileSize: 148
+# CHECK-NEXT: MemSize: 148
# CHECK-NEXT: Flags [
# CHECK-NEXT: PF_R
# CHECK-NEXT: ]
diff --git a/lld/test/elf2/basic32be.s b/lld/test/elf2/basic32be.s
index cc433d74f82..b0fd12b2392 100644
--- a/lld/test/elf2/basic32be.s
+++ b/lld/test/elf2/basic32be.s
@@ -30,7 +30,7 @@ _start:
# CHECK-NEXT: ]
# CHECK-NEXT: HeaderSize: 52
# CHECK-NEXT: ProgramHeaderEntrySize: 32
-# CHECK-NEXT: ProgramHeaderCount: 2
+# CHECK-NEXT: ProgramHeaderCount: 3
# CHECK-NEXT: SectionHeaderEntrySize: 40
# CHECK-NEXT: SectionHeaderCount: 6
# CHECK-NEXT: StringTableSectionIndex: 5
@@ -129,12 +129,24 @@ _start:
# CHECK-NEXT: ]
# CHECK-NEXT: ProgramHeaders [
# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_PHDR (0x6)
+# CHECK-NEXT: Offset: 0x34
+# CHECK-NEXT: VirtualAddress: 0x10000034
+# CHECK-NEXT: PhysicalAddress: 0x10000034
+# CHECK-NEXT: FileSize: 96
+# CHECK-NEXT: MemSize: 96
+# CHECK-NEXT: Flags [ (0x4)
+# CHECK-NEXT: PF_R (0x4)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 8
+# CHECK-NEXT: }
+# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_LOAD (0x1)
# CHECK-NEXT: Offset: 0x0
# CHECK-NEXT: VirtualAddress: 0x10000000
# CHECK-NEXT: PhysicalAddress: 0x10000000
-# CHECK-NEXT: FileSize: 116
-# CHECK-NEXT: MemSize: 116
+# CHECK-NEXT: FileSize: 148
+# CHECK-NEXT: MemSize: 148
# CHECK-NEXT: Flags [
# CHECK-NEXT: PF_R
# CHECK-NEXT: ]
diff --git a/lld/test/elf2/basic64be.s b/lld/test/elf2/basic64be.s
index 9c41baf993e..392ed5dd1aa 100644
--- a/lld/test/elf2/basic64be.s
+++ b/lld/test/elf2/basic64be.s
@@ -35,7 +35,7 @@ _start:
# CHECK-NEXT: ]
# CHECK-NEXT: HeaderSize: 64
# CHECK-NEXT: ProgramHeaderEntrySize: 56
-# CHECK-NEXT: ProgramHeaderCount: 3
+# CHECK-NEXT: ProgramHeaderCount: 4
# CHECK-NEXT: SectionHeaderEntrySize: 64
# CHECK-NEXT: SectionHeaderCount: 7
# CHECK-NEXT: StringTableSectionIndex: 6
@@ -163,13 +163,25 @@ _start:
# CHECK-NEXT: }
# CHECK-NEXT: ]
# CHECK-NEXT: ProgramHeaders [
+# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_PHDR (0x6)
+# CHECK-NEXT: Offset: 0x40
+# CHECK-NEXT: VirtualAddress: 0x10000040
+# CHECK-NEXT: PhysicalAddress: 0x10000040
+# CHECK-NEXT: FileSize: 224
+# CHECK-NEXT: MemSize: 224
+# CHECK-NEXT: Flags [ (0x4)
+# CHECK-NEXT: PF_R (0x4)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 8
+# CHECK-NEXT: }
# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_LOAD (0x1)
# CHECK-NEXT: Offset: 0x0
# CHECK-NEXT: VirtualAddress: 0x10000000
# CHECK-NEXT: PhysicalAddress: 0x10000000
-# CHECK-NEXT: FileSize: 232
-# CHECK-NEXT: MemSize: 232
+# CHECK-NEXT: FileSize: 288
+# CHECK-NEXT: MemSize: 288
# CHECK-NEXT: Flags [
# CHECK-NEXT: PF_R
# CHECK-NEXT: ]
diff --git a/lld/test/elf2/emulation.s b/lld/test/elf2/emulation.s
index 38e9d5e06a0..ea61cf920e6 100644
--- a/lld/test/elf2/emulation.s
+++ b/lld/test/elf2/emulation.s
@@ -23,7 +23,7 @@
# X86-64-NEXT: ]
# X86-64-NEXT: HeaderSize: 64
# X86-64-NEXT: ProgramHeaderEntrySize: 56
-# X86-64-NEXT: ProgramHeaderCount: 1
+# X86-64-NEXT: ProgramHeaderCount: 2
# X86-64-NEXT: SectionHeaderEntrySize: 64
# X86-64-NEXT: SectionHeaderCount: 6
# X86-64-NEXT: StringTableSectionIndex: 5
@@ -54,7 +54,7 @@
# X86-NEXT: ]
# X86-NEXT: HeaderSize: 52
# X86-NEXT: ProgramHeaderEntrySize: 32
-# X86-NEXT: ProgramHeaderCount: 1
+# X86-NEXT: ProgramHeaderCount: 2
# X86-NEXT: SectionHeaderEntrySize: 40
# X86-NEXT: SectionHeaderCount: 6
# X86-NEXT: StringTableSectionIndex: 5
@@ -85,7 +85,7 @@
# PPC64-NEXT: ]
# PPC64-NEXT: HeaderSize: 64
# PPC64-NEXT: ProgramHeaderEntrySize: 56
-# PPC64-NEXT: ProgramHeaderCount: 1
+# PPC64-NEXT: ProgramHeaderCount: 2
# PPC64-NEXT: SectionHeaderEntrySize: 64
# PPC64-NEXT: SectionHeaderCount: 6
# PPC64-NEXT: StringTableSectionIndex: 5
@@ -116,7 +116,7 @@
# PPC-NEXT: ]
# PPC-NEXT: HeaderSize: 52
# PPC-NEXT: ProgramHeaderEntrySize: 32
-# PPC-NEXT: ProgramHeaderCount: 1
+# PPC-NEXT: ProgramHeaderCount: 2
# PPC-NEXT: SectionHeaderEntrySize: 40
# PPC-NEXT: SectionHeaderCount: 6
# PPC-NEXT: StringTableSectionIndex: 5
diff --git a/lld/test/elf2/program-header-layout.s b/lld/test/elf2/program-header-layout.s
index 42472c29268..3ae68951700 100644
--- a/lld/test/elf2/program-header-layout.s
+++ b/lld/test/elf2/program-header-layout.s
@@ -33,6 +33,18 @@ _start:
# CHECK: ProgramHeaders [
# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_PHDR (0x6)
+# CHECK-NEXT: Offset: 0x40
+# CHECK-NEXT: VirtualAddress: 0x10040
+# CHECK-NEXT: PhysicalAddress: 0x10040
+# CHECK-NEXT: FileSize: 168
+# CHECK-NEXT: MemSize: 168
+# CHECK-NEXT: Flags [ (0x4)
+# CHECK-NEXT: PF_R (0x4)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 8
+# CHECK-NEXT: }
+# CHECK-NEXT: ProgramHeader {
# CHECK-NEXT: Type: PT_LOAD
# CHECK-NEXT: Offset: 0x0
# CHECK-NEXT: VirtualAddress:
diff --git a/lld/test/elf2/shared.s b/lld/test/elf2/shared.s
index 4dac06de123..57cc0d4a481 100644
--- a/lld/test/elf2/shared.s
+++ b/lld/test/elf2/shared.s
@@ -256,9 +256,8 @@
// CHECK-NEXT: 0x00000000 NULL 0x0
// CHECK-NEXT: ]
-// CHECK: ProgramHeaders [
-// CHECK-NEXT: ProgramHeader {
-// CHECK-NEXT: Type: PT_INTERP
+// CHECK: ProgramHeaders [
+// CHECK: Type: PT_INTERP
// CHECK-NEXT: Offset: [[INTERPOFFSET]]
// CHECK-NEXT: VirtualAddress: [[INTERPADDR]]
// CHECK-NEXT: PhysicalAddress: [[INTERPADDR]]
OpenPOWER on IntegriCloud