Bug 9682 - -fvisibility-inlines-hidden generates non-PIC code
: -fvisibility-inlines-hidden generates non-PIC code
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/gcc4.1-c++)
: unstable
: all Linux
: P2 normal
Assigned To:
:
: http://gcc.gnu.org/bugzilla/show_bug....
:
:
:
  Show dependency tree
 
Reported: 2006-06-07 18:13 by
Modified: 2008-10-18 16:28 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2006-06-07 18:13:26
При использовании опции -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 From 2006-06-07 18:25:03 -------
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 From 2006-06-07 18:52:07 -------
Вот 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 From 2006-06-07 18:55:25 -------
Тьфу, конечно же, не kdelibs, а kdebase.
------- Comment #4 From 2006-06-08 16:06:24 -------
А кто это первый нашёл?
------- Comment #5 From 2006-06-08 22:50:16 -------
Алексей Морозов напоролся на 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 From 2008-10-18 16:28:28 -------
Fixed upstream, available in gcc4.3-c++-4.3.2-alt1