Failing code: template<typename CharT> struct VisTest { inline VisTest (); }; template<typename CharT> inline VisTest<CharT>::VisTest() {} extern template class VisTest<char>; // It works if we drop that line int some_function( int do_something ) __attribute__ ((visibility("default"))); int some_function( int do_something ) { VisTest<char> a; return 0; }
g++ -fPIC -fvisibility=hidden -fvisibility-inlines-hidden lib.cpp -c g++ -shared -fPIC -fvisibility=hidden -fvisibility-inlines-hidden lib.o -o liblib.so /usr/lib/gcc/x86_64-pc-linux-gnu/4.0.0/../../../../x86_64-pc-linux-gnu/bin/ld: lib.o: relocation R_X86_64_PC32 against `VisTest<char>::VisTest()' can not be used when making a shared object; recompile with -fPIC /usr/lib/gcc/x86_64-pc-linux-gnu/4.0.0/../../../../x86_64-pc-linux-gnu/bin/ld: final link failed: Bad value collect2: ld returned 1 exit status This happens with nearly all cases in which libstdc++ headers are involved: http://bugs.gentoo.org/show_bug.cgi?id=78720 http://groups.google.de/groups?q=relocation+R_X86_64_PC32+against+making+a+shared+object&hl=de&lr=&selm=ct12kj%242njo%241%40FreeBSD.csie.NCTU.edu.tw&rnum=2 -- Summary: -fvisibility-inlines-hidden fails with gcc's extern template extension on amd64 Product: gcc Version: 4.0.0 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: andreas dot pokorny at gmx dot de CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: x86_64-pc-linux-gnu GCC host triplet: x86_64-pc-linux-gnu GCC target triplet: x86_64-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664