diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-09-09 20:26:23 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-09-09 20:26:23 +0000 |
commit | 778562fc78790402ec57bbd14a013a10c978a1cd (patch) | |
tree | 051543c6565ac4a4e3bf76ec028f6e42c51a48f1 | |
parent | d34dbf07bdbe022cc9e96f5de2ac315ec4b20373 (diff) | |
download | bcm5719-llvm-778562fc78790402ec57bbd14a013a10c978a1cd.tar.gz bcm5719-llvm-778562fc78790402ec57bbd14a013a10c978a1cd.zip |
Add the DT_NEEDED entries to the dynamic table.
llvm-svn: 247181
-rw-r--r-- | lld/ELF/Writer.cpp | 32 | ||||
-rw-r--r-- | lld/test/elf2/basic.s | 2 | ||||
-rw-r--r-- | lld/test/elf2/basic32.s | 2 | ||||
-rw-r--r-- | lld/test/elf2/basic32be.s | 2 | ||||
-rw-r--r-- | lld/test/elf2/basic64be.s | 2 | ||||
-rw-r--r-- | lld/test/elf2/shared.s | 2 |
6 files changed, 33 insertions, 9 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 91771b348f3..af615abf711 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -167,10 +167,10 @@ class DynamicSection final : public OutputSectionBase<Is64Bits> { typedef typename Base::Elf_Dyn Elf_Dyn; public: - DynamicSection(const StringTableSection<Is64Bits> &DynStrSec) + DynamicSection(SymbolTable &SymTab, StringTableSection<Is64Bits> &DynStrSec) : OutputSectionBase<Is64Bits>(".dynamic", SHT_DYNAMIC, SHF_ALLOC | SHF_WRITE), - DynStrSec(DynStrSec) { + DynStrSec(DynStrSec), SymTab(SymTab) { typename Base::HeaderT &Header = this->Header; Header.sh_addralign = Is64Bits ? 8 : 4; Header.sh_entsize = Is64Bits ? 16 : 8; @@ -178,6 +178,14 @@ public: unsigned NumEntries = 0; ++NumEntries; // DT_STRTAB + ++NumEntries; // DT_STRSZ + + const std::vector<std::unique_ptr<SharedFileBase>> &SharedFiles = + SymTab.getSharedFiles(); + for (const std::unique_ptr<SharedFileBase> &File : SharedFiles) + DynStrSec.add(File->getName()); + NumEntries += SharedFiles.size(); + ++NumEntries; // DT_NULL Header.sh_size = NumEntries * Header.sh_entsize; @@ -194,12 +202,26 @@ public: P->d_un.d_ptr = DynStrSec.getVA(); ++P; + P->d_tag = DT_STRSZ; + P->d_un.d_val = DynStrSec.StrTabBuilder.data().size(); + ++P; + + const std::vector<std::unique_ptr<SharedFileBase>> &SharedFiles = + SymTab.getSharedFiles(); + for (const std::unique_ptr<SharedFileBase> &File : SharedFiles) { + P->d_tag = DT_NEEDED; + P->d_un.d_val = DynStrSec.getFileOff(File->getName()); + ++P; + } + P->d_tag = DT_NULL; P->d_un.d_val = 0; + ++P; } private: - const StringTableSection<Is64Bits> &DynStrSec; + StringTableSection<Is64Bits> &DynStrSec; + SymbolTable &SymTab; }; // The writer writes a SymbolTable result to a file. @@ -212,7 +234,7 @@ public: typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym; Writer(SymbolTable *T) : StrTabSec(false), DynStrSec(true), SymTable(*T, StrTabSec), - DynamicSec(DynStrSec) {} + DynamicSec(*T, DynStrSec) {} void run(); private: @@ -638,7 +660,7 @@ template <class ELFT> void Writer<ELFT>::writeHeader() { auto PHdrs = reinterpret_cast<Elf_Phdr *>(Buf + EHdr->e_phoff); PHdrs->p_type = PT_LOAD; PHdrs->p_flags = PF_R | PF_X; - PHdrs->p_offset = 0x0000; + PHdrs->p_offset = 0x1000; PHdrs->p_vaddr = 0x1000; PHdrs->p_paddr = PHdrs->p_vaddr; PHdrs->p_filesz = FileSize; diff --git a/lld/test/elf2/basic.s b/lld/test/elf2/basic.s index 351f76722b2..a977b740006 100644 --- a/lld/test/elf2/basic.s +++ b/lld/test/elf2/basic.s @@ -151,7 +151,7 @@ _start: # CHECK-NEXT: ProgramHeaders [ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) -# CHECK-NEXT: Offset: 0x0 +# CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: VirtualAddress: 0x1000 # CHECK-NEXT: PhysicalAddress: 0x1000 # CHECK-NEXT: FileSize: 4592 diff --git a/lld/test/elf2/basic32.s b/lld/test/elf2/basic32.s index 4aace02108a..54a9cb6b94b 100644 --- a/lld/test/elf2/basic32.s +++ b/lld/test/elf2/basic32.s @@ -130,7 +130,7 @@ _start: # CHECK-NEXT: ProgramHeaders [ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) -# CHECK-NEXT: Offset: 0x0 +# CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: VirtualAddress: 0x1000 # CHECK-NEXT: PhysicalAddress: 0x1000 # CHECK-NEXT: FileSize: 4424 diff --git a/lld/test/elf2/basic32be.s b/lld/test/elf2/basic32be.s index b305ac9c73f..8b5be744485 100644 --- a/lld/test/elf2/basic32be.s +++ b/lld/test/elf2/basic32be.s @@ -130,7 +130,7 @@ _start: # CHECK-NEXT: ProgramHeaders [ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) -# CHECK-NEXT: Offset: 0x0 +# CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: VirtualAddress: 0x1000 # CHECK-NEXT: PhysicalAddress: 0x1000 # CHECK-NEXT: FileSize: 4424 diff --git a/lld/test/elf2/basic64be.s b/lld/test/elf2/basic64be.s index 52f1e9deef7..f065afd4e3d 100644 --- a/lld/test/elf2/basic64be.s +++ b/lld/test/elf2/basic64be.s @@ -151,7 +151,7 @@ _start: # CHECK-NEXT: ProgramHeaders [ # CHECK-NEXT: ProgramHeader { # CHECK-NEXT: Type: PT_LOAD (0x1) -# CHECK-NEXT: Offset: 0x0 +# CHECK-NEXT: Offset: 0x1000 # CHECK-NEXT: VirtualAddress: 0x1000 # CHECK-NEXT: PhysicalAddress: 0x1000 # CHECK-NEXT: FileSize: 4680 diff --git a/lld/test/elf2/shared.s b/lld/test/elf2/shared.s index 38e9186e665..66092196080 100644 --- a/lld/test/elf2/shared.s +++ b/lld/test/elf2/shared.s @@ -67,6 +67,8 @@ // CHECK: DynamicSection [ // CHECK-NEXT: Tag Type Name/Value // CHECK-NEXT: 0x00000005 STRTAB [[DYNSTRADDR]] +// CHECK-NEXT: 0x0000000A STRSZ +// CHECK-NEXT: 0x00000001 NEEDED SharedLibrary ({{.*}}/Inputs/i686-simple-library.so) // CHECK-NEXT: 0x00000000 NULL 0x0 // CHECK-NEXT: ] |