Głupie --as-needed

Jakub Bogusz qboosh w pld-linux.org
Nie, 11 Lut 2007, 20:13:39 CET


On Sat, Feb 10, 2007 at 04:20:58PM +0100, Marcin 'Qrczak' Kowalczyk wrote:
> Mam takie polecenie linkowania (nie w pakiecie PLD):
> 
> gcc -pthread small/perl/PerlNetHTTP.o -o
> small/perl/PerlNetHTTP ../lib/libko_Perl.so -rdynamic
> -Wl,-rpath,/usr/lib/perl5/5.8.8/athlon-pld-linux-thread-multi/CORE
> -Wl,--as-needed /usr/lib/perl5/5.8.8/athlon-pld-linux-thread-multi/auto/DynaLoader/DynaLoader.a -L/usr/lib/perl5/5.8.8/athlon-pld-linux-thread-multi/CORE -lperl -ldl -lm -lpthread -lc -lcrypt ../lib/libko_Core.so -lm -lgmp -lsigsafe -lrt /home/users/qrczak/cvs/kokogut-0.7.1/runtime/main.o
> 
> Fragment od -rdynamic do -lcrypt został wciągnięty przez:
>    perl -MExtUtils::Embed -e ldopts
> Jak widać, Perl przekazując opcje, z którymi był linkowany, przekazał
> również -Wl,--as-needed.

Nie powinien tego robić.

> Program się nie linkuje, m.in.:
>    ../lib/libko_Core.so: undefined reference to `timer_settime'
>    ../lib/libko_Core.so: undefined reference to `__gmpz_cmp'
> tzn. nie znajduje m.in. symboli z -lrt i -lgmp używanych
> w ../lib/libko_Core.so.

Bo libko_Core.so powinno być zlinkowane z -lrt -lgmp.

Jeszcze druga rzecz (gdyby wyszło potem) - .o powinno być przed
bibliotekami, z których korzysta.

> Dlaczego? Jak to poprawić (poza wysedowywaniem -Wl,--as-needed z opcji
> przekazywanych przez Perla)? Na moje oko kolejność bibliotek jest dobra.
> Jeśli zmienić libko_{Core,Perl}.so na libko_{Core,Perl}.a, to się
> linkuje. Te biblioteki z pewnych powodów są kompilowane bez -fPIC;
> nie wiem, czy to ma jakies znaczenie.

Jeżeli linkujesz do binarki (i bez -pie), to nie szkodzi.

> Czy Perl powinien przekazywać przez ldopts opcję -Wl,--as-needed, która
> psuje linkowanie?

Nie powinien.


-- 
Jakub Bogusz    http://qboosh.pl/


Więcej informacji o liście dyskusyjnej pld-devel-pl