[lld] r250176 - ELF2: Fix BSD's __progname symbol issue.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 13 09:39:21 PDT 2015


As per Ed Maste's report, this change should be the last one which needs to
link "hello world" on the FreeBSD platform.

On Tue, Oct 13, 2015 at 9:34 AM, Rui Ueyama via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: ruiu
> Date: Tue Oct 13 11:34:14 2015
> New Revision: 250176
>
> URL: http://llvm.org/viewvc/llvm-project?rev=250176&view=rev
> Log:
> ELF2: Fix BSD's __progname symbol issue.
>
> BSD's DSO files have undefined symbol "__progname" which is defined
> in crt1.o. On that system, both user programs and system shared
> libraries depend on each other.
>
> In general, we need to put symbols defined by user programs which are
> referenced by shared libraries to user program's .dynsym.
>
> http://reviews.llvm.org/D13637
>
> Added:
>     lld/trunk/test/elf2/progname.s
> Modified:
>     lld/trunk/ELF/Driver.cpp
>     lld/trunk/ELF/InputFiles.cpp
>     lld/trunk/ELF/InputFiles.h
>     lld/trunk/ELF/SymbolTable.cpp
>     lld/trunk/ELF/SymbolTable.h
>
> Modified: lld/trunk/ELF/Driver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=250176&r1=250175&r2=250176&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/Driver.cpp (original)
> +++ lld/trunk/ELF/Driver.cpp Tue Oct 13 11:34:14 2015
> @@ -227,5 +227,6 @@ template <class ELFT> void LinkerDriver:
>      Config->OutputFile = "a.out";
>
>    // Write the result to the file.
> +  Symtab.finalize();
>    writeResult<ELFT>(&Symtab);
>  }
>
> Modified: lld/trunk/ELF/InputFiles.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=250176&r1=250175&r2=250176&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/InputFiles.cpp (original)
> +++ lld/trunk/ELF/InputFiles.cpp Tue Oct 13 11:34:14 2015
> @@ -301,14 +301,14 @@ template <class ELFT> void SharedFile<EL
>    uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end());
>    SymbolBodies.reserve(NumSymbols);
>    for (const Elf_Sym &Sym : Syms) {
> -    if (Sym.isUndefined())
> -      continue;
> -
>      ErrorOr<StringRef> NameOrErr = Sym.getName(this->StringTable);
>      error(NameOrErr.getError());
>      StringRef Name = *NameOrErr;
>
> -    SymbolBodies.emplace_back(this, Name, Sym);
> +    if (Sym.isUndefined())
> +      Undefs.push_back(Name);
> +    else
> +      SymbolBodies.emplace_back(this, Name, Sym);
>    }
>  }
>
>
> Modified: lld/trunk/ELF/InputFiles.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=250176&r1=250175&r2=250176&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/InputFiles.h (original)
> +++ lld/trunk/ELF/InputFiles.h Tue Oct 13 11:34:14 2015
> @@ -169,6 +169,7 @@ template <class ELFT> class SharedFile :
>    typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range
> Elf_Sym_Range;
>
>    std::vector<SharedSymbol<ELFT>> SymbolBodies;
> +  std::vector<StringRef> Undefs;
>    StringRef SoName;
>
>  public:
> @@ -177,6 +178,8 @@ public:
>      return SymbolBodies;
>    }
>
> +  llvm::ArrayRef<StringRef> getUndefinedSymbols() { return Undefs; }
> +
>    static bool classof(const InputFile *F) {
>      return F->kind() == Base::SharedKind;
>    }
>
> Modified: lld/trunk/ELF/SymbolTable.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=250176&r1=250175&r2=250176&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.cpp (original)
> +++ lld/trunk/ELF/SymbolTable.cpp Tue Oct 13 11:34:14 2015
> @@ -181,6 +181,13 @@ template <class ELFT> Symbol *SymbolTabl
>    return Sym;
>  }
>
> +template <class ELFT> SymbolBody *SymbolTable<ELFT>::find(StringRef Name)
> {
> +  auto It = Symtab.find(Name);
> +  if (It == Symtab.end())
> +    return nullptr;
> +  return It->second->Body;
> +}
> +
>  template <class ELFT> void SymbolTable<ELFT>::addLazy(Lazy *New) {
>    Symbol *Sym = insert(New);
>    if (Sym->Body == New)
> @@ -230,6 +237,20 @@ template <class ELFT> void SymbolTable<E
>    addFile(std::move(File));
>  }
>
> +template <class ELFT> void SymbolTable<ELFT>::finalize() {
> +  // This code 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.
> +  for (std::unique_ptr<SharedFile<ELFT>> &File : SharedFiles)
> +    for (StringRef U : File->getUndefinedSymbols())
> +      if (SymbolBody *Sym = find(U))
> +        if (Sym->isDefined())
> +          Sym->setUsedInDynamicReloc();
> +}
> +
>  template class lld::elf2::SymbolTable<ELF32LE>;
>  template class lld::elf2::SymbolTable<ELF32BE>;
>  template class lld::elf2::SymbolTable<ELF64LE>;
>
> Modified: lld/trunk/ELF/SymbolTable.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=250176&r1=250175&r2=250176&view=diff
>
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.h (original)
> +++ lld/trunk/ELF/SymbolTable.h Tue Oct 13 11:34:14 2015
> @@ -52,6 +52,7 @@ public:
>    void addSyntheticSym(StringRef Name, OutputSection<ELFT> &Section,
>                         typename llvm::object::ELFFile<ELFT>::uintX_t
> Value);
>    void addIgnoredSym(StringRef Name);
> +  void finalize();
>
>  private:
>    Symbol *insert(SymbolBody *New);
> @@ -60,6 +61,7 @@ private:
>    void addMemberFile(Lazy *Body);
>    void checkCompatibility(std::unique_ptr<InputFile> &File);
>    void resolve(SymbolBody *Body);
> +  SymbolBody *find(StringRef Name);
>    void reportConflict(const Twine &Message, const SymbolBody &Old,
>                        const SymbolBody &New, bool Warning);
>
>
> Added: lld/trunk/test/elf2/progname.s
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/progname.s?rev=250176&view=auto
>
> ==============================================================================
> --- lld/trunk/test/elf2/progname.s (added)
> +++ lld/trunk/test/elf2/progname.s Tue Oct 13 11:34:14 2015
> @@ -0,0 +1,20 @@
> +// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %s -o %t.o
> +// RUN: echo '.global __progname' > %t2.s
> +// RUN: llvm-mc -filetype=obj -triple=i686-unknown-linux %t2.s -o %t2.o
> +// RUN: ld.lld2 -shared %t2.o -o %t2.so
> +// RUN: ld.lld2 -o %t %t.o %t2.so
> +// RUN: llvm-readobj -dyn-symbols %t | FileCheck %s
> +
> +// CHECK:      Name:     __progname@
> +// CHECK-NEXT: Value:    0x11000
> +// CHECK-NEXT: Size:     0
> +// CHECK-NEXT: Binding:  Global (0x1)
> +// CHECK-NEXT: Type:     None (0x0)
> +// CHECK-NEXT: Other:    0
> +// CHECK-NEXT: Section:  .text
> +// CHECK-NEXT: }
> +
> +.global _start, __progname
> +_start:
> +__progname:
> +  nop
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151013/979a8f10/attachment.html>


More information about the llvm-commits mailing list