При использовании опции -fvisibility-inlines-hidden при сборке разделяемых библиотек возникают TEXTREL, даже если используется опция -fPIC. $ cat stream_test.cc #include <iostream> void test() { std::cout << std::endl; } $ g++ -shared -o stream_test.so -g -Wall -W -fPIC stream_test.cc $ g++ -shared -o stream_test.so -fvisibility-inlines-hidden -g -Wall -W -fPIC stream_test.cc /usr/bin/ld: warning: creating a DT_TEXTREL in a shared object. На x86_64 это не собирается вообще: $ g++ -shared -o stream_test.so -fvisibility-inlines-hidden -g -Wall -W -fPIC stream_test.cc /usr/bin/ld: /tmp/.private/vsu/ccBFlW7p.o: relocation R_X86_64_PC32 against `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))@@GLIBCXX_3.4' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: final link failed: Bad value collect2: ld returned 1 exit status
18:19 < AMorozov> vsu: пожалуйста, добавьте следующее (у меня багзилловый эккаунт пролузился): на FC5/x86_64 (gcc version 4.1.0 20060304 (Red Hat 4.1.0-3)) баг _воспроизводится_ (причем, даже не компилируется вообще), а на SuSE-10 (gcc version 4.0.2 20050901 (prerelease) (SUSE Linux)) - все _хорошо_
Вот testcase попроще: $ cat inline_test.cc template <typename T> struct Test { static int test() { return 0; } }; extern template class Test<int>; int test1() { return Test<int>::test(); } g++ -shared -o inline_test.so -fvisibility-inlines-hidden -g -Wall -W -fPIC inline_test.cc /usr/bin/ld: warning: creating a DT_TEXTREL in a shared object. Без extern template всё нормально. С -O2 этот пример, как и предыдущий, тоже собирается нормально - вероятно, в этом случае нужна достаточно сложная функция, которую gcc не будет делать inline. Реально данная проблема проявилась при сборке kdelibs (вылезает textrel в /usr/lib/kde3/konq_sound.so) - там она возникает и при использовании -O2 -Os.
Тьфу, конечно же, не kdelibs, а kdebase.
А кто это первый нашёл?
Алексей Морозов напоролся на textrel непонятного происхождения при сборке kdebase, перебором различных опций (их там вставляется куча) выяснили, что при убирании -fvisibility-inlines-hidden проблема исчезает. Потом нашлось ещё: http://planet.gentoo.org/developers/flameeyes/2006/01/04/as_needed_part_3_and_misc (тут как раз написано про iostream) http://bugs.gentoo.org/show_bug.cgi?id=132045 Впрочем, оказывается, этой проблеме в gcc уже больше года.
Fixed upstream, available in gcc4.3-c++-4.3.2-alt1