Bug 20060 - ld --gc-sections fail with __tls_get_addr_opt
Summary: ld --gc-sections fail with __tls_get_addr_opt
Status: RESOLVED FIXED
Alias: None
Product: binutils
Classification: Unclassified
Component: ld (show other bugs)
Version: 2.26
: P2 normal
Target Milestone: 2.26
Assignee: Alan Modra
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-05-08 16:44 UTC by Bill Seurer
Modified: 2016-05-11 13:47 UTC (History)
1 user (show)

See Also:
Host:
Target: powerpc*
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Bill Seurer 2016-05-08 16:44:34 UTC
ubuntu@llvm-ppcle:~$ which ld
/usr/bin/ld
ubuntu@llvm-ppcle:~$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.26
Copyright (C) 2015 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.

Note that this code links just fine on a Fedora powerpc64le system that uses binutils 2.24.

[8/9] Linking CXX executable unittests/Support/SupportTests
FAILED: : && /usr/bin/c++   -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -std=c++11 -ffunction-sections -fdata-sections -O3  -Wl,-allow-shlib-undefined    -Wl,-O3 -Wl,--gc-sections unittests/Support/CMakeFiles/SupportTests.dir/AlignOfTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/AllocatorTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ArrayRecyclerTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/BlockFrequencyTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/BranchProbabilityTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/Casting.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/CommandLineTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/CompressionTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ConvertUTFTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/DataExtractorTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/DwarfTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/EndianStreamTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/EndianTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ErrorTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ErrorOrTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/FileOutputBufferTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/IteratorTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/LEB128Test.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/LineIteratorTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/LockFileManagerTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/MD5Test.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ManagedStatic.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/MathExtrasTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/MemoryBufferTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/MemoryTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/Path.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ProcessTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ProgramTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/RegexTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ReplaceFileTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ScaledNumberTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/SourceMgrTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/SpecialCaseListTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/StreamingMemoryObjectTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/StringPool.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/SwapByteOrderTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/TargetParserTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ThreadLocalTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ThreadPool.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/TimerTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/TimeValueTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/TypeNameTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/TrailingObjectsTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/UnicodeTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/YAMLIOTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/YAMLParserTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/formatted_raw_ostream_test.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/raw_ostream_test.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/raw_pwrite_stream_test.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/raw_sha1_ostream_test.cpp.o  -o unittests/Support/SupportTests  lib/libLLVMSupport.a lib/libLLVMSupport.a lib/libgtest_main.a lib/libgtest.a -lpthread lib/libLLVMSupport.a -lrt -ldl -lm -lpthread -Wl,-rpath,"\$ORIGIN/../../lib" && :
/usr/bin/ld: lib/libLLVMSupport.a(ThreadPool.cpp.o): In function `void std::__once_call_impl<std::_Bind_simple<std::_Mem_fn<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> (std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> >()':
ThreadPool.cpp:(.text._ZSt16__once_call_implISt12_Bind_simpleIFSt7_Mem_fnIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS2_12_Result_baseENS6_8_DeleterEEvEEPbEEPS3_SB_SC_EEEvv[_ZSt16__once_call_implISt12_Bind_simpleIFSt7_Mem_fnIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS2_12_Result_baseENS6_8_DeleterEEvEEPbEEPS3_SB_SC_EEEvv]+0x1c): unresolvable R_PPC64_REL24 against `__tls_get_addr_opt@@GLIBC_2.22'
ThreadPool.cpp:(.text._ZSt16__once_call_implISt12_Bind_simpleIFSt7_Mem_fnIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS2_12_Result_baseENS6_8_DeleterEEvEEPbEEPS3_SB_SC_EEEvv[_ZSt16__once_call_implISt12_Bind_simpleIFSt7_Mem_fnIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS2_12_Result_baseENS6_8_DeleterEEvEEPbEEPS3_SB_SC_EEEvv]+0x1c): relocation truncated to fit: R_PPC64_REL24 against symbol `__tls_get_addr_opt@@GLIBC_2.22' defined in .text section in /lib/powerpc64le-linux-gnu/ld64.so.2
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status

Based on a discussion I found I tried adding -Wl,--relax to the LDFLAGS but the error still occurs

FAILED: : && /usr/bin/c++   -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -std=c++11 -ffunction-sections -fdata-sections -O3  -Wl,--relax -Wl,-allow-shlib-undefined    -Wl,-O3 -Wl,--gc-sections unittests/Support/CMakeFiles/SupportTests.dir/AlignOfTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/AllocatorTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ArrayRecyclerTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/BlockFrequencyTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/BranchProbabilityTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/Casting.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/CommandLineTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/CompressionTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ConvertUTFTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/DataExtractorTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/DwarfTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/EndianStreamTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/EndianTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ErrorTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ErrorOrTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/FileOutputBufferTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/IteratorTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/LEB128Test.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/LineIteratorTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/LockFileManagerTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/MD5Test.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ManagedStatic.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/MathExtrasTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/MemoryBufferTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/MemoryTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/Path.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ProcessTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ProgramTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/RegexTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ReplaceFileTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ScaledNumberTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/SourceMgrTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/SpecialCaseListTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/StreamingMemoryObjectTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/StringPool.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/SwapByteOrderTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/TargetParserTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ThreadLocalTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/ThreadPool.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/TimerTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/TimeValueTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/TypeNameTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/TrailingObjectsTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/UnicodeTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/YAMLIOTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/YAMLParserTest.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/formatted_raw_ostream_test.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/raw_ostream_test.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/raw_pwrite_stream_test.cpp.o unittests/Support/CMakeFiles/SupportTests.dir/raw_sha1_ostream_test.cpp.o  -o unittests/Support/SupportTests  lib/libLLVMSupport.a lib/libLLVMSupport.a lib/libgtest_main.a lib/libgtest.a -lpthread lib/libLLVMSupport.a -lrt -ldl -lm -lpthread -Wl,-rpath,"\$ORIGIN/../../lib" && :
/usr/bin/ld: lib/libLLVMSupport.a(ThreadPool.cpp.o): In function `void std::__once_call_impl<std::_Bind_simple<std::_Mem_fn<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> (std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*)> >()':
ThreadPool.cpp:(.text._ZSt16__once_call_implISt12_Bind_simpleIFSt7_Mem_fnIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS2_12_Result_baseENS6_8_DeleterEEvEEPbEEPS3_SB_SC_EEEvv[_ZSt16__once_call_implISt12_Bind_simpleIFSt7_Mem_fnIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS2_12_Result_baseENS6_8_DeleterEEvEEPbEEPS3_SB_SC_EEEvv]+0x1c): unresolvable R_PPC64_REL24 against `__tls_get_addr_opt@@GLIBC_2.22'
ThreadPool.cpp:(.text._ZSt16__once_call_implISt12_Bind_simpleIFSt7_Mem_fnIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS2_12_Result_baseENS6_8_DeleterEEvEEPbEEPS3_SB_SC_EEEvv[_ZSt16__once_call_implISt12_Bind_simpleIFSt7_Mem_fnIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS2_12_Result_baseENS6_8_DeleterEEvEEPbEEPS3_SB_SC_EEEvv]+0x1c): relocation truncated to fit: R_PPC64_REL24 against symbol `__tls_get_addr_opt@@GLIBC_2.22' defined in .text section in /lib/powerpc64le-linux-gnu/ld64.so.2
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status

I also built and used my own copy of binutils-2.26 but again the same error occurs.
Comment 1 Sourceware Commits 2016-05-11 13:12:01 UTC
The master branch has been updated by Alan Modra <amodra@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=3bd43ebcb6025a8a43f119238f490e2e238697a2

commit 3bd43ebcb6025a8a43f119238f490e2e238697a2
Author: Alan Modra <amodra@gmail.com>
Date:   Wed May 11 21:54:05 2016 +0930

    ld --gc-sections fail with __tls_get_addr_opt
    
    When --gc-sections is active, __tls_get_addr_opt is marked as not
    needed and forced local before ppc*_elf_tls_setup is run.
    
    bfd/
    	PR 20060
    	* elf64-ppc.c (ppc64_elf_tls_setup): Clear forced_local.
    	* elf32-ppc.c (ppc_elf_tls_setup): Likewise.
    ld/
    	PR 20060
    	* testsuite/ld-powerpc/powerpc.exp: Run new tests.
    	* testsuite/ld-powerpc/tlsdll.s: New.
    	* testsuite/ld-powerpc/tlsdll.ver: New.
    	* testsuite/ld-powerpc/tlsdll_32.s: New.
    	* testsuite/ld-powerpc/tlsopt5.d: New.
    	* testsuite/ld-powerpc/tlsopt5.s: New.
    	* testsuite/ld-powerpc/tlsopt5_32.d: New.
    	* testsuite/ld-powerpc/tlsopt5_32.s: New.
Comment 2 Sourceware Commits 2016-05-11 13:44:51 UTC
The binutils-2_26-branch branch has been updated by Alan Modra <amodra@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ad79d09b98fcb5574b1353554018762628d2be88

commit ad79d09b98fcb5574b1353554018762628d2be88
Author: Alan Modra <amodra@gmail.com>
Date:   Wed May 11 21:54:05 2016 +0930

    ld --gc-sections fail with __tls_get_addr_opt
    
    When --gc-sections is active, __tls_get_addr_opt is marked as not
    needed and forced local before ppc*_elf_tls_setup is run.
    
    bfd/
    	PR 20060
    	* elf64-ppc.c (ppc64_elf_tls_setup): Clear forced_local.
    	* elf32-ppc.c (ppc_elf_tls_setup): Likewise.
    ld/
    	PR 20060
    	* testsuite/ld-powerpc/powerpc.exp: Run new tests.
    	* testsuite/ld-powerpc/tlsdll.s: New.
    	* testsuite/ld-powerpc/tlsdll.ver: New.
    	* testsuite/ld-powerpc/tlsdll_32.s: New.
    	* testsuite/ld-powerpc/tlsopt5.d: New.
    	* testsuite/ld-powerpc/tlsopt5.s: New.
    	* testsuite/ld-powerpc/tlsopt5_32.d: New.
    	* testsuite/ld-powerpc/tlsopt5_32.s: New.
Comment 3 Alan Modra 2016-05-11 13:47:02 UTC
Fixed master and 2.26