[lld] r249365 - [elf2] Ignore __tls_get_addr when static linking.

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 6 11:55:39 PDT 2015


On 5 October 2015 at 20:45, Michael J. Spencer via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: mspencer
> Date: Mon Oct  5 19:45:42 2015
> New Revision: 249365
>
> URL: http://llvm.org/viewvc/llvm-project?rev=249365&view=rev
> Log:
> [elf2] Ignore __tls_get_addr when static linking.
>
> Added:
>     lld/trunk/test/elf2/tls-static.s
> Modified:
>     lld/trunk/ELF/SymbolTable.cpp
>
> Modified: lld/trunk/ELF/SymbolTable.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=249365&r1=249364&r2=249365&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.cpp (original)
> +++ lld/trunk/ELF/SymbolTable.cpp Mon Oct  5 19:45:42 2015
> @@ -133,6 +133,13 @@ template <class ELFT> void SymbolTable::
>    // Given that the symbol is effectively unused, we just create a dummy
>    // hidden one to avoid the undefined symbol error.
>    addIgnoredSym<ELFT>("_GLOBAL_OFFSET_TABLE_");
> +
> +  // __tls_get_addr is defined by the dynamic linker for dynamic ELFs. For
> +  // static linking the linker is required to optimize away any references to
> +  // __tls_get_addr, so it's not defined anywhere. Create a hidden definition
> +  // to avoid the undefined symbol error.
> +  if (Config->Static)


That is the wrong variable to check. -static doesn't mean that the
produced output is static:

$ ld test2.o -o test2.so -shared -Bstatic
$ ld test.o  test2.so -shared -Bstatic -o t
$ file test2.so t
test2.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, not stripped
t:        ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, not stripped

gold does treat -static differently from -Bstatic but bfd does not and
the manual says so explicitly.

Also, we can produce a static binary without -static.

What you need to do is move this after all the files have been seen
and we know if we are producing a static program or not.

Please fix and add tests for both cases (has -static and produces a
shared, no -static and produce a static).

Cheers,
Rafael


More information about the llvm-commits mailing list