diff options
-rw-r--r-- | lld/ELF/InputFiles.cpp | 3 | ||||
-rw-r--r-- | lld/ELF/SymbolTable.cpp | 2 | ||||
-rw-r--r-- | lld/test/ELF/invalid/verdef-no-symtab.test | 26 |
3 files changed, 30 insertions, 1 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 6900f8f325d..25fff944c2e 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -610,6 +610,9 @@ template <class ELFT> void SharedFile<ELFT>::parseSoName() { } } + if (this->VersymSec && !this->Symtab) + error("SHT_GNU_versym should be associated with symbol table"); + this->initStringTable(); // DSOs are identified by soname, and they usually contain diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index c45ab94d0b5..0d8c62dd475 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -77,7 +77,7 @@ template <class ELFT> void SymbolTable<ELFT>::addFile(InputFile *File) { if (auto *F = dyn_cast<SharedFile<ELFT>>(File)) { // DSOs are uniquified not by filename but by soname. F->parseSoName(); - if (!SoNames.insert(F->getSoName()).second) + if (HasError || !SoNames.insert(F->getSoName()).second) return; SharedFiles.push_back(F); F->parseRest(); diff --git a/lld/test/ELF/invalid/verdef-no-symtab.test b/lld/test/ELF/invalid/verdef-no-symtab.test new file mode 100644 index 00000000000..5b5c32e4ff5 --- /dev/null +++ b/lld/test/ELF/invalid/verdef-no-symtab.test @@ -0,0 +1,26 @@ +# RUN: yaml2obj %s -o %t +# RUN: not ld.lld %t -o %tout 2>&1 | FileCheck %s + +## When we have SHT_GNU_versym section, it is should be associated +## with symbol table section. +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .versym + Type: SHT_GNU_versym + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1 + Content: "00000000" + + - Name: .verdef + Type: SHT_GNU_verdef + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1 + Content: "00000000" + + +# CHECK: SHT_GNU_versym should be associated with symbol table |