summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-09-09 20:26:23 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-09-09 20:26:23 +0000
commit778562fc78790402ec57bbd14a013a10c978a1cd (patch)
tree051543c6565ac4a4e3bf76ec028f6e42c51a48f1
parentd34dbf07bdbe022cc9e96f5de2ac315ec4b20373 (diff)
downloadbcm5719-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.cpp32
-rw-r--r--lld/test/elf2/basic.s2
-rw-r--r--lld/test/elf2/basic32.s2
-rw-r--r--lld/test/elf2/basic32be.s2
-rw-r--r--lld/test/elf2/basic64be.s2
-rw-r--r--lld/test/elf2/shared.s2
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: ]
OpenPOWER on IntegriCloud