diff options
-rw-r--r-- | lld/ELF/Writer.cpp | 28 | ||||
-rw-r--r-- | lld/test/elf2/shared.s | 32 |
2 files changed, 59 insertions, 1 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index f33257ea8ce..0ac98758398 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -200,6 +200,28 @@ private: }; template <class ELFT> +class HashTableSection final : public OutputSectionBase<ELFT::Is64Bits> { + typedef typename ELFFile<ELFT>::Elf_Word Elf_Word; + +public: + HashTableSection(const SymbolTableSection<ELFT> &DynSymSec) + : OutputSectionBase<ELFT::Is64Bits>(".hash", SHT_HASH, SHF_ALLOC), + DynSymSec(DynSymSec) { + this->Header.sh_entsize = sizeof(Elf_Word); + this->Header.sh_addralign = sizeof(Elf_Word); + } + + void finalize() override { + this->Header.sh_link = DynSymSec.getSectionIndex(); + } + + void writeTo(uint8_t *Buf) override {} + +private: + const SymbolTableSection<ELFT> &DynSymSec; +}; + +template <class ELFT> class DynamicSection final : public OutputSectionBase<ELFT::Is64Bits> { typedef OutputSectionBase<ELFT::Is64Bits> Base; typedef typename Base::HeaderT HeaderT; @@ -293,7 +315,8 @@ public: typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym; Writer(SymbolTable *T) : StrTabSec(false), DynStrSec(true), SymTabSec(*this, *T, StrTabSec), - DynSymSec(*this, *T, DynStrSec), DynamicSec(*T, DynSymSec) {} + DynSymSec(*this, *T, DynStrSec), DynamicSec(*T, DynSymSec), + HashSec(DynSymSec) {} void run(); const OutputSection<ELFT> &getBSS() const { @@ -334,6 +357,8 @@ private: DynamicSection<ELFT> DynamicSec; + HashTableSection<ELFT> HashSec; + InterpSection<ELFT::Is64Bits> InterpSec; OutputSection<ELFT> *BSSSec = nullptr; @@ -650,6 +675,7 @@ template <class ELFT> void Writer<ELFT>::createSections() { if (needsInterpSection()) OutputSections.push_back(&InterpSec); OutputSections.push_back(&DynSymSec); + OutputSections.push_back(&HashSec); OutputSections.push_back(&DynamicSec); OutputSections.push_back(&DynStrSec); } diff --git a/lld/test/elf2/shared.s b/lld/test/elf2/shared.s index 1140c9425ac..4c7f5c37d34 100644 --- a/lld/test/elf2/shared.s +++ b/lld/test/elf2/shared.s @@ -6,6 +6,38 @@ // RUN: llvm-readobj --program-headers --dynamic-table -t -s -dyn-symbols -section-data %t | FileCheck %s // REQUIRES: x86 + +// test that .hash is linked to .dynsym +// SO: Index: 4 +// SO-NEXT: Name: .dynsym +// SO-NEXT: Type: SHT_DYNSYM +// SO-NEXT: Flags [ +// SO-NEXT: SHF_ALLOC +// SO-NEXT: ] +// SO-NEXT: Address: +// SO-NEXT: Offset: +// SO-NEXT: Size: +// SO-NEXT: Link: +// SO-NEXT: Info: +// SO-NEXT: AddressAlignment: 4 +// SO-NEXT: EntrySize: 16 +// SO-NEXT: } +// SO-NEXT: Section { +// SO-NEXT: Index: 5 +// SO-NEXT: Name: .hash +// SO-NEXT: Type: SHT_HASH +// SO-NEXT: Flags [ +// SO-NEXT: SHF_ALLOC +// SO-NEXT: ] +// SO-NEXT: Address: +// SO-NEXT: Offset: +// SO-NEXT: Size: 0 +// SO-NEXT: Link: 4 +// SO-NEXT: Info: 0 +// SO-NEXT: AddressAlignment: 4 +// SO-NEXT: EntrySize: 4 +// SO-NEXT: } + // Make sure .symtab is properly aligned. // SO: Name: .symtab // SO-NEXT: Type: SHT_SYMTAB |