summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Writer.cpp28
-rw-r--r--lld/test/elf2/shared.s32
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
OpenPOWER on IntegriCloud