Put undefined symbols from shared libraries in the symbol table.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 27 Feb 2018 20:31:22 +0000 (20:31 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 27 Feb 2018 20:31:22 +0000 (20:31 +0000)
With the recent fixes these symbols have more in common than not with
regular undefined symbols.

llvm-svn: 326242

lld/ELF/Driver.cpp
lld/ELF/InputFiles.cpp
lld/ELF/InputFiles.h
lld/ELF/LinkerScript.cpp
lld/ELF/SymbolTable.cpp
lld/ELF/SymbolTable.h
lld/test/ELF/trace-symbols.s

index 244e8e1..938fd3e 100644 (file)
@@ -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);
index daba3bc..0bff035 100644 (file)
@@ -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;
     }
 
index 7a40046..5b9e9d7 100644 (file)
@@ -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;
index c0c2b84..85fef2d 100644 (file)
@@ -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;
 }
 
index 54febf5..358f7b6 100644 (file)
@@ -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>();
index 0113cc7..e36b52e 100644 (file)
@@ -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);
index c8ba9b2..2018f31 100644 (file)
@@ -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