From d03f97211a75db6e02f587b3d3b51dfe1411a277 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Mon, 20 Jun 2016 10:29:53 +0000 Subject: [PATCH] Revert r273143 "[ELF] - Basic versioned symbols support implemented." It broke buildbot: http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast llvm-svn: 273146 --- lld/ELF/Config.h | 10 --- lld/ELF/OutputSections.cpp | 96 ++------------------- lld/ELF/OutputSections.h | 30 +------ lld/ELF/SymbolListFile.cpp | 28 +++--- lld/ELF/SymbolListFile.h | 1 - lld/ELF/SymbolTable.cpp | 26 +----- lld/ELF/Symbols.cpp | 2 +- lld/ELF/Symbols.h | 18 ++-- lld/ELF/Writer.cpp | 13 +-- lld/test/ELF/Inputs/verdef.s | 6 -- lld/test/ELF/lto/version-script.ll | 50 ----------- lld/test/ELF/verdef.s | 131 ----------------------------- lld/test/ELF/version-script.s | 40 +-------- 13 files changed, 42 insertions(+), 409 deletions(-) delete mode 100644 lld/test/ELF/Inputs/verdef.s delete mode 100644 lld/test/ELF/lto/version-script.ll delete mode 100644 lld/test/ELF/verdef.s diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index d199db922cc6..be8059b46a9b 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -32,15 +32,6 @@ enum ELFKind { enum class BuildIdKind { None, Fnv1, Md5, Sha1, Hexstring }; -// This struct contains symbols version definition that -// can be found in version script if it is used for link. -struct Version { - Version(llvm::StringRef Name) : Name(Name) {} - llvm::StringRef Name; - std::vector Globals; - size_t NameOff; // Offset in string table. -}; - // This struct contains the global configuration for the linker. // Most fields are direct mapping from the command line options // and such fields have the same name as the corresponding options. @@ -59,7 +50,6 @@ struct Configuration { llvm::StringRef SoName; llvm::StringRef Sysroot; std::string RPath; - std::vector SymbolVersions; std::vector DynamicList; std::vector SearchPaths; std::vector Undefined; diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 774860294db9..040657a6b81c 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -591,11 +591,6 @@ void GnuHashTableSection::addSymbols( V.push_back({Sym.Body, Sym.STName}); } -// Returns the number of version definition entries. Because the first entry -// is for the version definition itself, it is the number of versioned symbols -// plus one. Note that we don't support multiple versions yet. -static unsigned getVerDefNum() { return Config->SymbolVersions.size() + 1; } - template DynamicSection::DynamicSection() : OutputSectionBase(".dynamic", SHT_DYNAMIC, SHF_ALLOC | SHF_WRITE) { @@ -698,16 +693,10 @@ template void DynamicSection::finalize() { if (!Config->Entry.empty()) Add({DT_DEBUG, (uint64_t)0}); - bool HasVerNeed = Out::VerNeed->getNeedNum() != 0; - if (HasVerNeed || Out::VerDef) + if (size_t NeedNum = Out::VerNeed->getNeedNum()) { Add({DT_VERSYM, Out::VerSym}); - if (Out::VerDef) { - Add({DT_VERDEF, Out::VerDef}); - Add({DT_VERDEFNUM, getVerDefNum()}); - } - if (HasVerNeed) { Add({DT_VERNEED, Out::VerNeed}); - Add({DT_VERNEEDNUM, Out::VerNeed->getNeedNum()}); + Add({DT_VERNEEDNUM, NeedNum}); } if (Config->EMachine == EM_MIPS) { @@ -1443,68 +1432,6 @@ SymbolTableSection::getOutputSection(SymbolBody *Sym) { return nullptr; } -template -VersionDefinitionSection::VersionDefinitionSection() - : OutputSectionBase(".gnu.version_d", SHT_GNU_verdef, SHF_ALLOC) {} - -static StringRef getFileDefName() { - if (!Config->SoName.empty()) - return Config->SoName; - return Config->OutputFile; -} - -template void VersionDefinitionSection::finalize() { - FileDefNameOff = Out::DynStrTab->addString(getFileDefName()); - for (Version &V : Config->SymbolVersions) - V.NameOff = Out::DynStrTab->addString(V.Name); - - this->Header.sh_size = - (sizeof(Elf_Verdef) + sizeof(Elf_Verdaux)) * getVerDefNum(); - this->Header.sh_link = Out::DynStrTab->SectionIndex; - this->Header.sh_addralign = sizeof(uint32_t); - - // sh_info should be set to the number of definitions. This fact is missed in - // documentation, but confirmed by binutils community: - // https://sourceware.org/ml/binutils/2014-11/msg00355.html - this->Header.sh_info = getVerDefNum(); -} - -template -static void writeDefinition(Elf_Verdef *&Verdef, Elf_Verdaux *&Verdaux, - uint32_t Flags, uint32_t Index, StringRef Name, - size_t StrTabOffset) { - Verdef->vd_version = 1; - Verdef->vd_cnt = 1; - Verdef->vd_aux = - reinterpret_cast(Verdaux) - reinterpret_cast(Verdef); - Verdef->vd_next = sizeof(Elf_Verdef); - - Verdef->vd_flags = Flags; - Verdef->vd_ndx = Index; - Verdef->vd_hash = hashSysv(Name); - ++Verdef; - - Verdaux->vda_name = StrTabOffset; - Verdaux->vda_next = 0; - ++Verdaux; -} - -template -void VersionDefinitionSection::writeTo(uint8_t *Buf) { - Elf_Verdef *Verdef = reinterpret_cast(Buf); - Elf_Verdaux *Verdaux = - reinterpret_cast(Verdef + getVerDefNum()); - - writeDefinition(Verdef, Verdaux, VER_FLG_BASE, 1, getFileDefName(), - FileDefNameOff); - - uint32_t I = 2; - for (Version &V : Config->SymbolVersions) - writeDefinition(Verdef, Verdaux, 0 /* Flags */, I++, V.Name, V.NameOff); - - Verdef[-1].vd_next = 0; -} - template VersionTableSection::VersionTableSection() : OutputSectionBase(".gnu.version", SHT_GNU_versym, SHF_ALLOC) { @@ -1524,7 +1451,10 @@ template void VersionTableSection::writeTo(uint8_t *Buf) { auto *OutVersym = reinterpret_cast(Buf) + 1; for (const std::pair &P : Out::DynSymTab->getSymbols()) { - OutVersym->vs_index = P.first->symbol()->VersionId; + if (auto *SS = dyn_cast>(P.first)) + OutVersym->vs_index = SS->VersionId; + else + OutVersym->vs_index = VER_NDX_GLOBAL; ++OutVersym; } } @@ -1533,17 +1463,12 @@ template VersionNeedSection::VersionNeedSection() : OutputSectionBase(".gnu.version_r", SHT_GNU_verneed, SHF_ALLOC) { this->Header.sh_addralign = sizeof(uint32_t); - - // Identifiers in verneed section start at 2 because 0 and 1 are reserved - // for VER_NDX_LOCAL and VER_NDX_GLOBAL. - // First identifiers are reserved by verdef section if it exist. - NextIndex = getVerDefNum() + 1; } template void VersionNeedSection::addSymbol(SharedSymbol *SS) { if (!SS->Verdef) { - SS->symbol()->VersionId = VER_NDX_GLOBAL; + SS->VersionId = VER_NDX_GLOBAL; return; } SharedFile *F = SS->File; @@ -1561,7 +1486,7 @@ void VersionNeedSection::addSymbol(SharedSymbol *SS) { SS->File->getStringTable().data() + SS->Verdef->getAux()->vda_name); NV.Index = NextIndex++; } - SS->symbol()->VersionId = NV.Index; + SS->VersionId = NV.Index; } template void VersionNeedSection::writeTo(uint8_t *Buf) { @@ -1817,11 +1742,6 @@ template class VersionNeedSection; template class VersionNeedSection; template class VersionNeedSection; -template class VersionDefinitionSection; -template class VersionDefinitionSection; -template class VersionDefinitionSection; -template class VersionDefinitionSection; - template class BuildIdSection; template class BuildIdSection; template class BuildIdSection; diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h index 7fe0e9c02d70..4b05e71dd4e2 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -25,7 +25,6 @@ namespace elf { class SymbolBody; struct SectionPiece; -struct Version; template class SymbolTable; template class SymbolTableSection; template class StringTableSection; @@ -249,30 +248,10 @@ private: // For more information about .gnu.version and .gnu.version_r see: // https://www.akkadia.org/drepper/symbol-versioning -// The .gnu.version_d section which has a section type of SHT_GNU_verdef shall -// contain symbol version definitions. The number of entries in this section -// shall be contained in the DT_VERDEFNUM entry of the .dynamic section. -// The section shall contain an array of Elf_Verdef structures, optionally -// followed by an array of Elf_Verdaux structures. -template -class VersionDefinitionSection final : public OutputSectionBase { - typedef typename ELFT::Verdef Elf_Verdef; - typedef typename ELFT::Verdaux Elf_Verdaux; - - unsigned FileDefNameOff; - -public: - VersionDefinitionSection(); - void finalize() override; - void writeTo(uint8_t *Buf) override; -}; - // The .gnu.version section specifies the required version of each symbol in the // dynamic symbol table. It contains one Elf_Versym for each dynamic symbol // table entry. An Elf_Versym is just a 16-bit integer that refers to a version -// identifier defined in the either .gnu.version_r or .gnu.version_d section. -// The values 0 and 1 are reserved. All other values are used for versions in -// the own object or in any of the dependencies. +// identifier defined in the .gnu.version_r section. template class VersionTableSection final : public OutputSectionBase { typedef typename ELFT::Versym Elf_Versym; @@ -297,8 +276,9 @@ class VersionNeedSection final : public OutputSectionBase { // string table offsets of their sonames. std::vector *, size_t>> Needed; - // The next available version identifier. - unsigned NextIndex; + // The next available version identifier. Identifiers start at 2 because 0 and + // 1 are reserved. + unsigned NextIndex = 2; public: VersionNeedSection(); @@ -650,7 +630,6 @@ template struct Out { static StringTableSection *StrTab; static SymbolTableSection *DynSymTab; static SymbolTableSection *SymTab; - static VersionDefinitionSection *VerDef; static VersionTableSection *VerSym; static VersionNeedSection *VerNeed; static Elf_Phdr *TlsPhdr; @@ -679,7 +658,6 @@ template StringTableSection *Out::ShStrTab; template StringTableSection *Out::StrTab; template SymbolTableSection *Out::DynSymTab; template SymbolTableSection *Out::SymTab; -template VersionDefinitionSection *Out::VerDef; template VersionTableSection *Out::VerSym; template VersionNeedSection *Out::VerNeed; template typename ELFT::Phdr *Out::TlsPhdr; diff --git a/lld/ELF/SymbolListFile.cpp b/lld/ELF/SymbolListFile.cpp index 2d5d1c523718..3d1377be4383 100644 --- a/lld/ELF/SymbolListFile.cpp +++ b/lld/ELF/SymbolListFile.cpp @@ -77,21 +77,21 @@ public: void run(); private: - void parseVersion(StringRef Version); + void parseVersion(); void parseLocal(); - void parseVersionSymbols(StringRef Version); + void parseVersionSymbols(); }; -void VersionScriptParser::parseVersion(StringRef Version) { +void VersionScriptParser::parseVersion() { expect("{"); if (peek() == "global:") { next(); - parseVersionSymbols(Version); + parseVersionSymbols(); } if (peek() == "local:") parseLocal(); else - parseVersionSymbols(Version); + parseVersionSymbols(); expect("}"); expect(";"); @@ -104,21 +104,13 @@ void VersionScriptParser::parseLocal() { Config->VersionScriptGlobalByDefault = false; } -void VersionScriptParser::parseVersionSymbols(StringRef Version) { - std::vector *Globals; - if (Version.empty()) { - Globals = &Config->VersionScriptGlobals; - } else { - Config->SymbolVersions.push_back(elf::Version(Version)); - Globals = &Config->SymbolVersions.back().Globals; - } - +void VersionScriptParser::parseVersionSymbols() { for (;;) { StringRef Cur = peek(); if (Cur == "}" || Cur == "local:") return; next(); - Globals->push_back(Cur); + Config->VersionScriptGlobals.push_back(Cur); expect(";"); } } @@ -127,18 +119,18 @@ void VersionScriptParser::run() { StringRef Msg = "anonymous version definition is used in " "combination with other version definitions"; if (peek() == "{") { - parseVersion(""); + parseVersion(); if (!atEOF()) setError(Msg); return; } while (!atEOF() && !Error) { - if (peek() == "{") { + if (next() == "{") { setError(Msg); return; } - parseVersion(next()); + parseVersion(); } } diff --git a/lld/ELF/SymbolListFile.h b/lld/ELF/SymbolListFile.h index 8f826d2957e1..60362a805ffb 100644 --- a/lld/ELF/SymbolListFile.h +++ b/lld/ELF/SymbolListFile.h @@ -11,7 +11,6 @@ #define LLD_ELF_SYMBOL_LIST_FILE_H #include "lld/Core/LLVM.h" -#include "llvm/ADT/MapVector.h" #include "llvm/Support/MemoryBuffer.h" namespace lld { diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index c5d92325451d..e9cee22c1bf3 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -175,10 +175,7 @@ std::pair SymbolTable::insert(StringRef Name) { Sym->Visibility = STV_DEFAULT; Sym->IsUsedInRegularObj = false; Sym->ExportDynamic = false; - if (Config->VersionScriptGlobalByDefault) - Sym->VersionId = VER_NDX_GLOBAL; - else - Sym->VersionId = VER_NDX_LOCAL; + Sym->VersionScriptGlobal = Config->VersionScriptGlobalByDefault; SymVector.push_back(Sym); } else { Sym = SymVector[P.first->second]; @@ -517,24 +514,9 @@ template void SymbolTable::scanDynamicList() { // symbols with the VersionScriptGlobal flag, which acts as a filter on the // dynamic symbol table. template void SymbolTable::scanVersionScript() { - // If version script does not contain versions declarations, - // we just should mark global symbols. - if (!Config->VersionScriptGlobals.empty()) { - for (StringRef S : Config->VersionScriptGlobals) - if (SymbolBody *B = find(S)) - B->symbol()->VersionId = VER_NDX_GLOBAL; - return; - } - - // If we have symbols version declarations, we should - // assign version references for each symbol. - size_t I = 2; - for (Version &V : Config->SymbolVersions) { - for (StringRef Name : V.Globals) - if (SymbolBody *B = find(Name)) - B->symbol()->VersionId = I; - ++I; - } + for (StringRef S : Config->VersionScriptGlobals) + if (SymbolBody *B = find(S)) + B->symbol()->VersionScriptGlobal = true; } template class elf::SymbolTable; diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index 9fd5de2220e9..0ba571b7e9ab 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -267,7 +267,7 @@ std::string elf::demangle(StringRef Name) { bool Symbol::includeInDynsym() const { if (Visibility != STV_DEFAULT && Visibility != STV_PROTECTED) return false; - return (ExportDynamic && VersionId != VER_NDX_LOCAL) || body()->isShared() || + return (ExportDynamic && VersionScriptGlobal) || body()->isShared() || (body()->isUndefined() && Config->Shared); } diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index 62ef088784d8..8b103ae889a2 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -30,7 +30,6 @@ class BitcodeFile; class InputFile; class LazyObjectFile; class SymbolBody; -struct Version; template class ObjectFile; template class OutputSection; template class OutputSectionBase; @@ -303,8 +302,13 @@ public: SharedFile *File; const Elf_Sym &Sym; - // This field is a pointer to the symbol's version definition. - const Elf_Verdef *Verdef; + // This field is initially a pointer to the symbol's version definition. As + // symbols are added to the version table, this field is replaced with the + // version identifier to be stored in .gnu.version in the output file. + union { + const Elf_Verdef *Verdef; + uint16_t VersionId; + }; // OffsetInBss is significant only when needsCopy() is true. uintX_t OffsetInBss = 0; @@ -403,9 +407,6 @@ struct Symbol { // it is weak. uint8_t Binding; - // Version definition index. - uint16_t VersionId; - // Symbol visibility. This is the computed minimum visibility of all // observed non-DSO symbols. unsigned Visibility : 2; @@ -422,6 +423,11 @@ struct Symbol { // --export-dynamic, and by dynamic lists. unsigned ExportDynamic : 1; + // This flag acts as an additional filter on the dynamic symbol list. It is + // set if there is no version script, or if the symbol appears in the global + // section of the version script. + unsigned VersionScriptGlobal : 1; + bool includeInDynsym() const; bool isWeak() const { return Binding == llvm::ELF::STB_WEAK; } diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index d5761e792922..65ddb2010db6 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -136,7 +136,6 @@ template void elf::writeResult(SymbolTable *Symtab) { std::unique_ptr> StrTab; std::unique_ptr> SymTabSec; std::unique_ptr> MipsRldMap; - std::unique_ptr> VerDef; if (Config->BuildId == BuildIdKind::Fnv1) BuildId.reset(new BuildIdFnv1); @@ -171,8 +170,6 @@ template void elf::writeResult(SymbolTable *Symtab) { MipsRldMap->setSize(sizeof(uintX_t)); MipsRldMap->updateAlignment(sizeof(uintX_t)); } - if (!Config->SymbolVersions.empty()) - VerDef.reset(new VersionDefinitionSection()); Out::Bss = &Bss; Out::BuildId = BuildId.get(); @@ -192,7 +189,6 @@ template void elf::writeResult(SymbolTable *Symtab) { Out::ShStrTab = &ShStrTab; Out::StrTab = StrTab.get(); Out::SymTab = SymTabSec.get(); - Out::VerDef = VerDef.get(); Out::VerSym = &VerSym; Out::VerNeed = &VerNeed; Out::MipsRldMap = MipsRldMap.get(); @@ -908,15 +904,10 @@ template void Writer::addPredefinedSections() { Add(Out::StrTab); if (isOutputDynamic()) { Add(Out::DynSymTab); - - bool HasVerNeed = Out::VerNeed->getNeedNum() != 0; - if (Out::VerDef || HasVerNeed) + if (Out::VerNeed->getNeedNum() != 0) { Add(Out::VerSym); - if (Out::VerDef) - Add(Out::VerDef); - if (HasVerNeed) Add(Out::VerNeed); - + } Add(Out::GnuHashTab); Add(Out::HashTab); Add(Out::Dynamic); diff --git a/lld/test/ELF/Inputs/verdef.s b/lld/test/ELF/Inputs/verdef.s deleted file mode 100644 index 349d5fd0c261..000000000000 --- a/lld/test/ELF/Inputs/verdef.s +++ /dev/null @@ -1,6 +0,0 @@ -.text -.globl _start -_start: - callq a - callq b - callq c diff --git a/lld/test/ELF/lto/version-script.ll b/lld/test/ELF/lto/version-script.ll deleted file mode 100644 index 11a7f073ab51..000000000000 --- a/lld/test/ELF/lto/version-script.ll +++ /dev/null @@ -1,50 +0,0 @@ -; REQUIRES: x86 -; RUN: llvm-as %s -o %t.o -; RUN: echo "VERSION_1.0{ global: foo; local: *; }; VERSION_2.0{ global: bar; local: *; };" > %t.script -; RUN: ld.lld -m elf_x86_64 %t.o -o %t2 -shared --version-script %t.script -save-temps -; RUN: llvm-dis < %t2.lto.bc | FileCheck %s -; RUN: llvm-readobj -V -dyn-symbols %t2 | FileCheck --check-prefix=DSO %s - -target triple = "x86_64-unknown-linux-gnu" -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" - -define void @foo() { - ret void -} - -define void @bar() { - ret void -} - -; CHECK: define void @foo() -; CHECK: define void @bar() - -; DSO: DynamicSymbols [ -; DSO: Symbol { -; DSO: Name: @ (0) -; DSO: Value: 0x0 -; DSO: Size: 0 -; DSO: Binding: Local -; DSO: Type: None -; DSO: Other: 0 -; DSO: Section: Undefined -; DSO: } -; DSO: Symbol { -; DSO: Name: foo@@VERSION_1.0 -; DSO: Value: 0x1000 -; DSO: Size: 1 -; DSO: Binding: Global -; DSO: Type: Function -; DSO: Other: 0 -; DSO: Section: .text -; DSO: } -; DSO: Symbol { -; DSO: Name: bar@@VERSION_2.0 -; DSO: Value: 0x1010 -; DSO: Size: 1 -; DSO: Binding: Global -; DSO: Type: Function -; DSO: Other: 0 -; DSO: Section: .text -; DSO: } -; DSO: ] diff --git a/lld/test/ELF/verdef.s b/lld/test/ELF/verdef.s deleted file mode 100644 index 064f27d5d60a..000000000000 --- a/lld/test/ELF/verdef.s +++ /dev/null @@ -1,131 +0,0 @@ -# REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o -# RUN: echo "LIBSAMPLE_1.0{ \ -# RUN: global: a; \ -# RUN: local: *; }; \ -# RUN: LIBSAMPLE_2.0{ \ -# RUN: global: b; \ -# RUN: local: *; }; \ -# RUN: LIBSAMPLE_3.0{ \ -# RUN: global: c; \ -# RUN: local: *; };" > %t.script -# RUN: ld.lld --version-script %t.script -shared %t.o -o %t.so -# RUN: llvm-readobj -V -dyn-symbols %t.so | FileCheck --check-prefix=DSO %s - -# DSO: Version symbols { -# DSO-NEXT: Section Name: .gnu.version -# DSO-NEXT: Address: 0x228 -# DSO-NEXT: Offset: 0x228 -# DSO-NEXT: Link: 1 -# DSO-NEXT: Symbols [ -# DSO-NEXT: Symbol { -# DSO-NEXT: Version: 0 -# DSO-NEXT: Name: @ -# DSO-NEXT: } -# DSO-NEXT: Symbol { -# DSO-NEXT: Version: 2 -# DSO-NEXT: Name: a@@LIBSAMPLE_1.0 -# DSO-NEXT: } -# DSO-NEXT: Symbol { -# DSO-NEXT: Version: 3 -# DSO-NEXT: Name: b@@LIBSAMPLE_2.0 -# DSO-NEXT: } -# DSO-NEXT: Symbol { -# DSO-NEXT: Version: 4 -# DSO-NEXT: Name: c@@LIBSAMPLE_3.0 -# DSO-NEXT: } -# DSO-NEXT: ] -# DSO-NEXT: } -# DSO-NEXT: Version definition { -# DSO-NEXT: Section Name: .gnu.version_d -# DSO-NEXT: Address: 0x230 -# DSO-NEXT: Offset: 0x230 -# DSO-NEXT: Link: 5 -# DSO-NEXT: Entries [ -# DSO-NEXT: Entry { -# DSO-NEXT: Offset: 0x0 -# DSO-NEXT: Rev: 1 -# DSO-NEXT: Flags: 1 -# DSO-NEXT: Index: 1 -# DSO-NEXT: Cnt: 1 -# DSO-NEXT: Hash: 146942095 -# DSO-NEXT: Name: -# DSO-NEXT: } -# DSO-NEXT: Entry { -# DSO-NEXT: Offset: 0x14 -# DSO-NEXT: Rev: 1 -# DSO-NEXT: Flags: 0 -# DSO-NEXT: Index: 2 -# DSO-NEXT: Cnt: 1 -# DSO-NEXT: Hash: 98457184 -# DSO-NEXT: Name: LIBSAMPLE_1.0 -# DSO-NEXT: } -# DSO-NEXT: Entry { -# DSO-NEXT: Offset: 0x28 -# DSO-NEXT: Rev: 1 -# DSO-NEXT: Flags: 0 -# DSO-NEXT: Index: 3 -# DSO-NEXT: Cnt: 1 -# DSO-NEXT: Hash: 98456416 -# DSO-NEXT: Name: LIBSAMPLE_2.0 -# DSO-NEXT: } -# DSO-NEXT: Entry { -# DSO-NEXT: Offset: 0x3C -# DSO-NEXT: Rev: 1 -# DSO-NEXT: Flags: 0 -# DSO-NEXT: Index: 4 -# DSO-NEXT: Cnt: 1 -# DSO-NEXT: Hash: 98456672 -# DSO-NEXT: Name: LIBSAMPLE_3.0 -# DSO-NEXT: } -# DSO-NEXT: ] -# DSO-NEXT: } -# DSO-NEXT: SHT_GNU_verneed { -# DSO-NEXT: } - -## Check that we can link agains DSO we produced. -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %S/Inputs/verdef.s -o %tmain.o -# RUN: ld.lld %tmain.o %t.so -o %tout -# RUN: llvm-readobj -V %tout | FileCheck --check-prefix=MAIN %s - -# MAIN: Version symbols { -# MAIN-NEXT: Section Name: .gnu.version -# MAIN-NEXT: Address: 0x10228 -# MAIN-NEXT: Offset: 0x228 -# MAIN-NEXT: Link: 1 -# MAIN-NEXT: Symbols [ -# MAIN-NEXT: Symbol { -# MAIN-NEXT: Version: 0 -# MAIN-NEXT: Name: @ -# MAIN-NEXT: } -# MAIN-NEXT: Symbol { -# MAIN-NEXT: Version: 2 -# MAIN-NEXT: Name: a@LIBSAMPLE_1.0 -# MAIN-NEXT: } -# MAIN-NEXT: Symbol { -# MAIN-NEXT: Version: 3 -# MAIN-NEXT: Name: b@LIBSAMPLE_2.0 -# MAIN-NEXT: } -# MAIN-NEXT: Symbol { -# MAIN-NEXT: Version: 4 -# MAIN-NEXT: Name: c@LIBSAMPLE_3.0 -# MAIN-NEXT: } -# MAIN-NEXT: ] -# MAIN-NEXT: } -# MAIN-NEXT: Version definition { -# MAIN-NEXT: } - -.globl a -.type a,@function -a: -retq - -.globl b -.type b,@function -b: -retq - -.globl c -.type c,@function -c: -retq diff --git a/lld/test/ELF/version-script.s b/lld/test/ELF/version-script.s index b4b48f22eb23..8310aedb2908 100644 --- a/lld/test/ELF/version-script.s +++ b/lld/test/ELF/version-script.s @@ -26,7 +26,7 @@ # RUN: global: foo3; \ # RUN: local: *; }; " > %t4.script # RUN: ld.lld --version-script %t4.script -shared %t.o %t2.so -o %t4.so -# RUN: llvm-readobj -dyn-symbols %t4.so | FileCheck --check-prefix=VERDSO %s +# RUN: llvm-readobj -dyn-symbols %t4.so | FileCheck --check-prefix=DSO %s # RUN: echo "VERSION_1.0{ \ # RUN: global: foo1; \ @@ -140,44 +140,6 @@ # EXE-NEXT: } # EXE-NEXT: ] -# VERDSO: DynamicSymbols [ -# VERDSO-NEXT: Symbol { -# VERDSO-NEXT: Name: @ -# VERDSO-NEXT: Value: 0x0 -# VERDSO-NEXT: Size: 0 -# VERDSO-NEXT: Binding: Local -# VERDSO-NEXT: Type: None -# VERDSO-NEXT: Other: 0 -# VERDSO-NEXT: Section: Undefined -# VERDSO-NEXT: } -# VERDSO-NEXT: Symbol { -# VERDSO-NEXT: Name: bar@ -# VERDSO-NEXT: Value: 0x0 -# VERDSO-NEXT: Size: 0 -# VERDSO-NEXT: Binding: Global -# VERDSO-NEXT: Type: Function -# VERDSO-NEXT: Other: 0 -# VERDSO-NEXT: Section: Undefined -# VERDSO-NEXT: } -# VERDSO-NEXT: Symbol { -# VERDSO-NEXT: Name: foo1@@VERSION_1.0 -# VERDSO-NEXT: Value: 0x1000 -# VERDSO-NEXT: Size: 0 -# VERDSO-NEXT: Binding: Global -# VERDSO-NEXT: Type: None -# VERDSO-NEXT: Other: 0 -# VERDSO-NEXT: Section: .text -# VERDSO-NEXT: } -# VERDSO-NEXT: Symbol { -# VERDSO-NEXT: Name: foo3@@VERSION_2.0 -# VERDSO-NEXT: Value: 0x1007 -# VERDSO-NEXT: Size: 0 -# VERDSO-NEXT: Binding: Global -# VERDSO-NEXT: Type: None -# VERDSO-NEXT: Other: 0 -# VERDSO-NEXT: Section: .text -# VERDSO-NEXT: } -# VERDSO-NEXT: ] # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o # RUN: ld.lld -shared %t.o %t2.so -o %t.so