summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2018-02-27 20:31:22 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2018-02-27 20:31:22 +0000
commit3f4c673d38ffec51dde1eb9d5e99d840e687160e (patch)
tree46cd6d7e38a34a67ec29b8bad4bd065d69579e31
parentbf28a8fc01fd09733da540176bd824ca9da6fa78 (diff)
downloadbcm5719-llvm-3f4c673d38ffec51dde1eb9d5e99d840e687160e.tar.gz
bcm5719-llvm-3f4c673d38ffec51dde1eb9d5e99d840e687160e.zip
Put undefined symbols from shared libraries in the symbol table.
With the recent fixes these symbols have more in common than not with regular undefined symbols. llvm-svn: 326242
-rw-r--r--lld/ELF/Driver.cpp4
-rw-r--r--lld/ELF/InputFiles.cpp5
-rw-r--r--lld/ELF/InputFiles.h8
-rw-r--r--lld/ELF/LinkerScript.cpp4
-rw-r--r--lld/ELF/SymbolTable.cpp28
-rw-r--r--lld/ELF/SymbolTable.h1
-rw-r--r--lld/test/ELF/trace-symbols.s2
7 files changed, 5 insertions, 47 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 244e8e1f8a8..938fd3e982a 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1085,10 +1085,6 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
// They also might be exported if referenced by DSOs.
Script->declareSymbols();
- // Handle undefined symbols in DSOs.
- if (!Config->Shared)
- Symtab->scanShlibUndefined<ELFT>();
-
// Handle the -exclude-libs option.
if (Args.hasArg(OPT_exclude_libs))
excludeLibs<ELFT>(Args);
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index daba3bce45c..0bff0350e6b 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -851,7 +851,10 @@ template <class ELFT> void SharedFile<ELFT>::parseRest() {
StringRef Name = CHECK(Sym.getName(this->StringTable), this);
if (Sym.isUndefined()) {
- this->Undefs.insert(Name);
+ Symbol *S = Symtab->addUndefined<ELFT>(Name, Sym.getBinding(),
+ Sym.st_other, Sym.getType(),
+ /*CanOmitFromDynSym=*/false, this);
+ S->ExportDynamic = true;
continue;
}
diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h
index 7a4004657a1..5b9e9d79eba 100644
--- a/lld/ELF/InputFiles.h
+++ b/lld/ELF/InputFiles.h
@@ -93,13 +93,6 @@ public:
return Symbols;
}
- // Returns undefined symbols of a shared library.
- // It is a runtime error to call this function on files of other types.
- const llvm::DenseSet<StringRef> &getUndefinedSymbols() {
- assert(FileKind == SharedKind);
- return Undefs;
- }
-
// Filename of .a which contained this file. If this file was
// not in an archive file, it is the empty string. We use this
// string for creating error messages.
@@ -121,7 +114,6 @@ protected:
InputFile(Kind K, MemoryBufferRef M);
std::vector<InputSectionBase *> Sections;
std::vector<Symbol *> Symbols;
- llvm::DenseSet<StringRef> Undefs;
private:
const Kind FileKind;
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index c0c2b8434cc..85fef2d47bb 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -129,10 +129,6 @@ static bool shouldDefineSym(SymbolAssignment *Cmd) {
Symbol *B = Symtab->find(Cmd->Name);
if (B && !B->isDefined())
return true;
- // It might also be referenced by a DSO.
- for (InputFile *F : SharedFiles)
- if (F->getUndefinedSymbols().count(Cmd->Name))
- return true;
return false;
}
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 54febf59a25..358f7b699f9 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -588,29 +588,6 @@ template <class ELFT> void SymbolTable::fetchIfLazy(StringRef Name) {
}
}
-// This function takes care of the case in which shared libraries depend on
-// the user program (not the other way, which is usual). Shared libraries
-// may have undefined symbols, expecting that the user program provides
-// the definitions for them. An example is BSD's __progname symbol.
-// We need to put such symbols to the main program's .dynsym so that
-// shared libraries can find them.
-// Except this, we ignore undefined symbols in DSOs.
-template <class ELFT> void SymbolTable::scanShlibUndefined() {
- for (InputFile *F : SharedFiles) {
- for (StringRef U : F->getUndefinedSymbols()) {
- Symbol *Sym = find(U);
- if (!Sym)
- continue;
- if (auto *L = dyn_cast<Lazy>(Sym))
- if (InputFile *File = L->fetch())
- addFile<ELFT>(File);
-
- if (Sym->isDefined())
- Sym->ExportDynamic = true;
- }
- }
-}
-
// Initialize DemangledSyms with a map from demangled symbols to symbol
// objects. Used to handle "extern C++" directive in version scripts.
//
@@ -836,8 +813,3 @@ template void SymbolTable::fetchIfLazy<ELF32LE>(StringRef);
template void SymbolTable::fetchIfLazy<ELF32BE>(StringRef);
template void SymbolTable::fetchIfLazy<ELF64LE>(StringRef);
template void SymbolTable::fetchIfLazy<ELF64BE>(StringRef);
-
-template void SymbolTable::scanShlibUndefined<ELF32LE>();
-template void SymbolTable::scanShlibUndefined<ELF32BE>();
-template void SymbolTable::scanShlibUndefined<ELF64LE>();
-template void SymbolTable::scanShlibUndefined<ELF64BE>();
diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h
index 0113cc775b4..e36b52e2195 100644
--- a/lld/ELF/SymbolTable.h
+++ b/lld/ELF/SymbolTable.h
@@ -78,7 +78,6 @@ public:
InputFile *File);
template <class ELFT> void fetchIfLazy(StringRef Name);
- template <class ELFT> void scanShlibUndefined();
void scanVersionScript();
Symbol *find(StringRef Name);
diff --git a/lld/test/ELF/trace-symbols.s b/lld/test/ELF/trace-symbols.s
index c8ba9b21bcd..2018f31e3b1 100644
--- a/lld/test/ELF/trace-symbols.s
+++ b/lld/test/ELF/trace-symbols.s
@@ -69,7 +69,7 @@
# RUN: ld.lld -y foo -y bar %t %t1.so %t2.so -o %t3 | \
# RUN: FileCheck -check-prefix=SHLIBRBAR %s
-# SHLIBRBAR-NOT: trace-symbols.s.tmp1.so: reference to bar
+# SHLIBRBAR: trace-symbols.s.tmp1.so: reference to bar
# RUN: ld.lld -y foo -y bar %t -u bar --start-lib %t1 %t2 --end-lib -o %t3 | \
# RUN: FileCheck -check-prefix=STARTLIB %s
OpenPOWER on IntegriCloud