summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-09-30 21:57:53 +0000
committerRui Ueyama <ruiu@google.com>2015-09-30 21:57:53 +0000
commit2dfd74f758da92d7c2ebd7590722092001d5622e (patch)
tree2b03172069934831300868114ae604fdea3e0e06
parentf1eca25b16b9016b2c058559106ec233ceabfa5c (diff)
downloadbcm5719-llvm-2dfd74f758da92d7c2ebd7590722092001d5622e.tar.gz
bcm5719-llvm-2dfd74f758da92d7c2ebd7590722092001d5622e.zip
ELF2: Add DT_REL{,A}ENT and DT_SYMENT.
According to the ELF specification, these dynamic array entries are mandatory. http://reviews.llvm.org/D13303 llvm-svn: 248952
-rw-r--r--lld/ELF/OutputSections.cpp12
-rw-r--r--lld/ELF/OutputSections.h3
-rw-r--r--lld/test/elf2/dynamic-reloc.s2
-rw-r--r--lld/test/elf2/shared.s17
4 files changed, 33 insertions, 1 deletions
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp
index dc3e68f1249..17bd9a64d4d 100644
--- a/lld/ELF/OutputSections.cpp
+++ b/lld/ELF/OutputSections.cpp
@@ -189,9 +189,11 @@ template <class ELFT> void DynamicSection<ELFT>::finalize() {
unsigned NumEntries = 0;
if (RelaDynSec.hasRelocs()) {
++NumEntries; // DT_RELA / DT_REL
- ++NumEntries; // DT_RELASZ / DTRELSZ
+ ++NumEntries; // DT_RELASZ / DT_RELSZ
+ ++NumEntries; // DT_RELAENT / DT_RELENT
}
++NumEntries; // DT_SYMTAB
+ ++NumEntries; // DT_SYMENT
++NumEntries; // DT_STRTAB
++NumEntries; // DT_STRSZ
++NumEntries; // DT_HASH
@@ -227,12 +229,20 @@ template <class ELFT> void DynamicSection<ELFT>::writeTo(uint8_t *Buf) {
P->d_tag = IsRela ? DT_RELASZ : DT_RELSZ;
P->d_un.d_val = RelaDynSec.getSize();
++P;
+
+ P->d_tag = IsRela ? DT_RELAENT : DT_RELENT;
+ P->d_un.d_val = IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel);
+ ++P;
}
P->d_tag = DT_SYMTAB;
P->d_un.d_ptr = DynSymSec.getVA();
++P;
+ P->d_tag = DT_SYMENT;
+ P->d_un.d_ptr = sizeof(Elf_Sym);
+ ++P;
+
P->d_tag = DT_STRTAB;
P->d_un.d_ptr = DynStrSec.getVA();
++P;
diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h
index 24f85b22808..f3937e2bba3 100644
--- a/lld/ELF/OutputSections.h
+++ b/lld/ELF/OutputSections.h
@@ -313,6 +313,9 @@ template <class ELFT>
class DynamicSection final : public OutputSectionBase<ELFT::Is64Bits> {
typedef OutputSectionBase<ELFT::Is64Bits> Base;
typedef typename Base::HeaderT HeaderT;
+ typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
+ typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
+ typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
public:
DynamicSection(SymbolTable &SymTab, HashTableSection<ELFT> &HashSec,
diff --git a/lld/test/elf2/dynamic-reloc.s b/lld/test/elf2/dynamic-reloc.s
index 4aac5c0cd61..5a4b55157da 100644
--- a/lld/test/elf2/dynamic-reloc.s
+++ b/lld/test/elf2/dynamic-reloc.s
@@ -45,7 +45,9 @@
// CHECK-NEXT: Tag Type Name/Value
// CHECK-NEXT: 0x0000000000000007 RELA [[RELAADDR]]
// CHECK-NEXT: 0x0000000000000008 RELASZ [[RELASIZE]] (bytes)
+// CHECK-NEXT: 0x0000000000000009 RELAENT 24 (bytes)
// CHECK-NEXT: 0x0000000000000006 SYMTAB
+// CHECK-NEXT: 0x000000000000000B SYMENT 24 (bytes)
// CHECK-NEXT: 0x0000000000000005 STRTAB
// CHECK-NEXT: 0x000000000000000A STRSZ
// CHECK-NEXT: 0x0000000000000004 HASH
diff --git a/lld/test/elf2/shared.s b/lld/test/elf2/shared.s
index 8304e7f24a9..dcda240ee10 100644
--- a/lld/test/elf2/shared.s
+++ b/lld/test/elf2/shared.s
@@ -117,7 +117,22 @@
// CHECK-NEXT: Address: [[RELADDR:.*]]
// CHECK-NEXT: Offset:
// CHECK-NEXT: Size: [[RELSIZE:.*]]
+// CHECK-NEXT: Link:
+// CHECK-NEXT: Info:
+// CHECK-NEXT: AddressAlignment:
+// CHECK-NEXT: EntrySize: [[RELENT:.*]]
+// CHECK: Name: .symtab
+// CHECK-NEXT: Type: SHT_SYMTAB
+// CHECK-NEXT: Flags [
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address:
+// CHECK-NEXT: Offset:
+// CHECK-NEXT: Size:
+// CHECK-NEXT: Link:
+// CHECK-NEXT: Info:
+// CHECK-NEXT: AddressAlignment:
+// CHECK-NEXT: EntrySize: [[SYMENT:.*]]
// CHECK: Symbols [
// CHECK-NEXT: Symbol {
@@ -231,7 +246,9 @@
// CHECK-NEXT: Tag Type Name/Value
// CHECK-NEXT: 0x00000011 REL [[RELADDR]]
// CHECK-NEXT: 0x00000012 RELSZ [[RELSIZE]] (bytes)
+// CHECK-NEXT: 0x00000013 RELENT [[RELENT]] (bytes)
// CHECK-NEXT: 0x00000006 SYMTAB [[DYNSYMADDR]]
+// CHECK-NEXT: 0x0000000B SYMENT [[SYMENT]] (bytes)
// CHECK-NEXT: 0x00000005 STRTAB [[DYNSTRADDR]]
// CHECK-NEXT: 0x0000000A STRSZ
// CHECK-NEXT: 0x00000004 HASH [[HASHADDR]]
OpenPOWER on IntegriCloud