From 2dfd74f758da92d7c2ebd7590722092001d5622e Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 30 Sep 2015 21:57:53 +0000 Subject: [PATCH] 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 --- lld/ELF/OutputSections.cpp | 12 +++++++++++- lld/ELF/OutputSections.h | 3 +++ lld/test/elf2/dynamic-reloc.s | 2 ++ lld/test/elf2/shared.s | 17 +++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index dc3e68f12497..17bd9a64d4d4 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -189,9 +189,11 @@ template void DynamicSection::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 void DynamicSection::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 24f85b228084..f3937e2bba31 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -313,6 +313,9 @@ template class DynamicSection final : public OutputSectionBase { typedef OutputSectionBase Base; typedef typename Base::HeaderT HeaderT; + typedef typename llvm::object::ELFFile::Elf_Rel Elf_Rel; + typedef typename llvm::object::ELFFile::Elf_Rela Elf_Rela; + typedef typename llvm::object::ELFFile::Elf_Sym Elf_Sym; public: DynamicSection(SymbolTable &SymTab, HashTableSection &HashSec, diff --git a/lld/test/elf2/dynamic-reloc.s b/lld/test/elf2/dynamic-reloc.s index 4aac5c0cd61d..5a4b55157da6 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 8304e7f24a9f..dcda240ee105 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]]