[lld] r292146 - Give priority to linker scripts over preemption.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 16 10:45:33 PST 2017


We would probably pull this to the 4.0 release.

Rafael Espindola via llvm-commits <llvm-commits at lists.llvm.org> writes:

> Author: rafael
> Date: Mon Jan 16 11:35:23 2017
> New Revision: 292146
>
> URL: http://llvm.org/viewvc/llvm-project?rev=292146&view=rev
> Log:
> Give priority to linker scripts over preemption.
>
> LLD exports symbols that are also present in used shared libraries to
> make sure they are preempted at runtime. That is a reasonable default,
> but we must allow for it to be overwritten with linker script. If we
> don't, libraries that expect to be able to hide a c++ delete operator
> will fail.
>
> This should fix the firebird build.
>
> Added:
>     lld/trunk/test/ELF/version-script-hide-so-symbol.s
> Modified:
>     lld/trunk/ELF/SymbolTable.cpp
>     lld/trunk/ELF/Symbols.cpp
>     lld/trunk/test/ELF/gc-sections-shared.s
>
> Modified: lld/trunk/ELF/SymbolTable.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=292146&r1=292145&r2=292146&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.cpp (original)
> +++ lld/trunk/ELF/SymbolTable.cpp Mon Jan 16 11:35:23 2017
> @@ -426,12 +426,8 @@ void SymbolTable<ELFT>::addShared(Shared
>    std::tie(S, WasInserted) =
>        insert(Name, Sym.getType(), STV_DEFAULT, /*CanOmitFromDynSym*/ true, F);
>    // Make sure we preempt DSO symbols with default visibility.
> -  if (Sym.getVisibility() == STV_DEFAULT) {
> +  if (Sym.getVisibility() == STV_DEFAULT)
>      S->ExportDynamic = true;
> -    // Exporting preempting symbols takes precedence over linker scripts.
> -    if (S->VersionId == VER_NDX_LOCAL)
> -      S->VersionId = VER_NDX_GLOBAL;
> -  }
>    if (WasInserted || isa<Undefined<ELFT>>(S->body())) {
>      replaceBody<SharedSymbol<ELFT>>(S, F, Name, Sym, Verdef);
>      if (!S->isWeak())
>
> Modified: lld/trunk/ELF/Symbols.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=292146&r1=292145&r2=292146&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.cpp (original)
> +++ lld/trunk/ELF/Symbols.cpp Mon Jan 16 11:35:23 2017
> @@ -299,7 +299,8 @@ uint8_t Symbol::computeBinding() const {
>      return Binding;
>    if (Visibility != STV_DEFAULT && Visibility != STV_PROTECTED)
>      return STB_LOCAL;
> -  if (VersionId == VER_NDX_LOCAL && !body()->isUndefined())
> +  const SymbolBody *Body = body();
> +  if (VersionId == VER_NDX_LOCAL && !Body->isUndefined() && !Body->isShared())
>      return STB_LOCAL;
>    if (Config->NoGnuUnique && Binding == STB_GNU_UNIQUE)
>      return STB_GLOBAL;
>
> Modified: lld/trunk/test/ELF/gc-sections-shared.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/gc-sections-shared.s?rev=292146&r1=292145&r2=292146&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/gc-sections-shared.s (original)
> +++ lld/trunk/test/ELF/gc-sections-shared.s Mon Jan 16 11:35:23 2017
> @@ -19,15 +19,6 @@
>  # CHECK-NEXT:     Section: Undefined (0x0)
>  # CHECK-NEXT:   }
>  # CHECK-NEXT:   Symbol {
> -# CHECK-NEXT:     Name: bar
> -# CHECK-NEXT:     Value:
> -# CHECK-NEXT:     Size:
> -# CHECK-NEXT:     Binding: Global
> -# CHECK-NEXT:     Type:
> -# CHECK-NEXT:     Other:
> -# CHECK-NEXT:     Section: .text
> -# CHECK-NEXT:   }
> -# CHECK-NEXT:   Symbol {
>  # CHECK-NEXT:     Name: bar2
>  # CHECK-NEXT:     Value:
>  # CHECK-NEXT:     Size:
>
> Added: lld/trunk/test/ELF/version-script-hide-so-symbol.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/version-script-hide-so-symbol.s?rev=292146&view=auto
> ==============================================================================
> --- lld/trunk/test/ELF/version-script-hide-so-symbol.s (added)
> +++ lld/trunk/test/ELF/version-script-hide-so-symbol.s Mon Jan 16 11:35:23 2017
> @@ -0,0 +1,28 @@
> +# REQUIRES: x86
> +
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
> +# RUN: ld.lld -shared %t.o -o %t2.so
> +# RUN: echo "{ local: *; };" > %t.script
> +# RUN: ld.lld --version-script %t.script -shared %t.o %t2.so -o %t.so
> +# RUN: llvm-readobj -dyn-symbols %t.so | FileCheck %s
> +
> +# The symbol foo must be hidden. This matches bfd and gold and is
> +# required to make it possible for a c++ library to hide its own
> +# operator delete.
> +
> +# CHECK:      DynamicSymbols [
> +# CHECK-NEXT:   Symbol {
> +# CHECK-NEXT:     Name: @ (0)
> +# CHECK-NEXT:     Value: 0x0
> +# CHECK-NEXT:     Size: 0
> +# CHECK-NEXT:     Binding: Local
> +# CHECK-NEXT:     Type: None
> +# CHECK-NEXT:     Other: 0
> +# CHECK-NEXT:     Section: Undefined
> +# CHECK-NEXT:   }
> +# CHECK-NEXT: ]
> +
> +        .global foo
> +foo:
> +	nop
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list