Bug 9682

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

Description Sergey Vlasov 2006-06-07 18:13:26 MSD
При использовании опции -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
Comment 1 Sergey Vlasov 2006-06-07 18:25:03 MSD
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)) - все _хорошо_


Comment 2 Sergey Vlasov 2006-06-07 18:52:07 MSD
Вот 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.
Comment 3 Sergey Vlasov 2006-06-07 18:55:25 MSD
Тьфу, конечно же, не kdelibs, а kdebase.
Comment 4 Dmitry V. Levin 2006-06-08 16:06:24 MSD
А кто это первый нашёл?
Comment 5 Sergey Vlasov 2006-06-08 22:50:16 MSD
Алексей Морозов напоролся на 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 уже больше года.
Comment 6 Dmitry V. Levin 2008-10-18 16:28:28 MSD
Fixed upstream, available in gcc4.3-c++-4.3.2-alt1