https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66971
Bug ID: 66971 Summary: thread_local with external linkage and constructor cannot be compiled correctly Product: gcc Version: 5.2.0 Status: UNCONFIRMED Keywords: link-failure Severity: critical Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: zhykzhykzhyk at gmail dot com Target Milestone: --- $ cat 1.cc #include <string> #include <cstdio> extern thread_local std::string s; int main() { puts(s.c_str()); } $ cat 2.cc #include <string> thread_local std::string s{"OK"}; $ g++ -v Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/home/zhyk/gcc5-install/libexec/gcc/x86_64-unknown-linux-gnu/5.2.0/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: ../configure --prefix=/home/zhyk/gcc5-install --disable-multilib Thread model: posix gcc version 5.2.0 (GCC) $ g++ -std=c++14 1.cc /tmp/cckqIckV.o: In function `TLS wrapper function for s': 1.cc:(.text._ZTW1s[_ZTW1s]+0x5): undefined reference to `TLS init function for s' 1.cc:(.text._ZTW1s[_ZTW1s]+0x15): undefined reference to `s[abi:cxx11]' collect2: error: ld returned 1 exit status $ g++ -std=c++14 1.cc 2.cc /tmp/ccSIxWf0.o: In function `TLS wrapper function for s': 1.cc:(.text._ZTW1s[_ZTW1s]+0x5): undefined reference to `TLS init function for s' collect2: error: ld returned 1 exit status It compiles but gives wrong result in 5.1.0 in OSX: $ g++ -v Using built-in specs. COLLECT_GCC=g++-5 COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/5.1.0/libexec/gcc/x86_64-apple-darwin14.4.0/5.1.0/lto-wrapper Target: x86_64-apple-darwin14.4.0 Configured with: ../configure --build=x86_64-apple-darwin14.4.0 --prefix=/usr/local/Cellar/gcc/5.1.0 --libdir=/usr/local/Cellar/gcc/5.1.0/lib/gcc/5 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-5 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --enable-libstdcxx-time=yes --enable-stage1-checking --enable-checking=release --enable-lto --with-build-config=bootstrap-debug --disable-werror --with-pkgversion='Homebrew gcc 5.1.0' --with-bugurl=https://github.com/Homebrew/homebrew/issues --enable-plugin --disable-nls --enable-multilib --with-native-system-header-dir=/usr/include --with-sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk Thread model: posix gcc version 5.1.0 (Homebrew gcc 5.1.0) $ g++ -std=c++14 1.cc 2.cc $ ./a.out (null) But it works correctly in 4.9.3: $ /usr/bin/g++ -v Using built-in specs. COLLECT_GCC=/usr/bin/g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.9.3-1' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --with-arch-32=i586 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.9.3 (Debian 4.9.3-1) $ /usr/bin/g++ -std=c++14 1.cc 2.cc $ ./a.out OK