Summary: | -fvisibility-inlines-hidden generates non-PIC code | ||
---|---|---|---|
Product: | Sisyphus | Reporter: | Sergey Vlasov <vsu> |
Component: | gcc4.1-c++ | Assignee: | Dmitry V. Levin <ldv> |
Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
Severity: | normal | ||
Priority: | P2 | CC: | glebfm |
Version: | unstable | ||
Hardware: | all | ||
OS: | Linux | ||
URL: | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664 |
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 |
При использовании опции -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