Revert "[ELF] Fix linking when a regular object defines a symbol that is used in a DSO"

This commit reverts r218259 because it needed to be checked in with
a few binary files for the test.

llvm-svn: 218262
This commit is contained in:
Rui Ueyama 2014-09-22 18:08:34 +00:00
parent f2a721a875
commit 869c0019b1
4 changed files with 13 additions and 16 deletions

View File

@ -262,8 +262,8 @@ public:
void setCreateSeparateROSegment() { _mergeRODataToTextSegment = false; }
bool hasCoalescedSharedLibPair(StringRef name) const {
return _sharedLibCoalescedSymbols.count(name) != 0;
bool hasCoalescedWeakPair(StringRef name) const {
return _weakCoalescedSymbols.count(name) != 0;
}
private:
@ -300,7 +300,7 @@ protected:
StringRefVector _rpathList;
StringRefVector _rpathLinkList;
std::map<std::string, uint64_t> _absoluteSymbols;
llvm::StringSet<> _sharedLibCoalescedSymbols;
llvm::StringSet<> _weakCoalescedSymbols;
};
} // end namespace lld

View File

@ -241,6 +241,11 @@ std::unique_ptr<File> ELFLinkingContext::createUndefinedSymbolFile() const {
return std::move(undefinedSymFile);
}
static bool isSharedWeakAtom(const UndefinedAtom *ua) {
return ua->canBeNull() != UndefinedAtom::canBeNullNever &&
isa<SharedLibraryFile>(ua->file());
}
void ELFLinkingContext::notifySymbolTableCoalesce(const Atom *existingAtom,
const Atom *newAtom,
bool &useNew) {
@ -254,12 +259,11 @@ void ELFLinkingContext::notifySymbolTableCoalesce(const Atom *existingAtom,
ua = dyn_cast<UndefinedAtom>(existingAtom);
}
if (da && ua && da->scope() == Atom::scopeGlobal &&
isa<SharedLibraryFile>(ua->file()))
// If strong defined atom coalesces away an atom declared
// in the shared object the strong atom needs to be dynamically exported.
if (da && ua && da->scope() == Atom::scopeGlobal && isSharedWeakAtom(ua))
// If strong defined atom coalesces away weak atom declared
// in the shared object the strong atom needs to be dynamicaly exported.
// Save its name.
_sharedLibCoalescedSymbols.insert(ua->name());
_weakCoalescedSymbols.insert(ua->name());
}
} // end namespace lld

View File

@ -183,7 +183,7 @@ void OutputELFWriter<ELFT>::buildDynamicSymbolTable(const File &file) {
for (const auto &atom : section->atoms()) {
const DefinedAtom *da = dyn_cast<const DefinedAtom>(atom->_atom);
if (da && (da->dynamicExport() == DefinedAtom::dynamicExportAlways ||
_context.hasCoalescedSharedLibPair(da->name())))
_context.hasCoalescedWeakPair(da->name())))
_dynamicSymbolTable->addSymbol(atom->_atom, section->ordinal(),
atom->_virtualAddr, atom);
}

View File

@ -1,7 +0,0 @@
# Tests that a reference from a DSO to a regular object
# forces the final executable to export the symbol.
RUN: lld -flavor gnu -target x86_64 %p/Inputs/defobj.o -L%p/Inputs -lundef2 -o %t1
RUN: llvm-readobj -dyn-symbols %t1 | FileCheck -check-prefix CHECKSYMS %s
CHECKSYMS: myexportedsymbol