Jaki jest sposób wydrukowania ścieżek wyszukiwania, które w kolejności wyszukiwania były wyświetlane przez ld .
153
Możesz to zrobić, wykonując następujące polecenie:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc przekazuje kilka dodatkowych ścieżek -L do konsolidatora, które można wyświetlić za pomocą następującego polecenia:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
Odpowiedzi sugerujące użycie ld.so.conf i ldconfig nie są poprawne, ponieważ odnoszą się do ścieżek przeszukiwanych przez dynamiczny konsolidator środowiska wykonawczego (tj. Za każdym razem, gdy program jest wykonywany), co nie jest tym samym, co ścieżka przeszukiwana przez ld (tj. Kiedykolwiek program jest połączony).
/usr/local/..
których występuje błąd braku biblioteki, a linkowanie kończy się niepowodzeniem. Za/usr/local
każdym razem muszę zmieniać nazwę, aby wykluczyć tę ścieżkę wyszukiwania. Czy istnieje prosty sposób na wykluczenie lub zastąpienie/usr/local
ścieżki?ld
ścieżki wyszukiwania. Na przykład czasami muszę skompilować kod źródłowymakefile
lub wygenerować plik makefile zeconfigure
skryptu lub zCMakeLists.txt
lub nawet bardziej skomplikowanych, takich jakvala
lubsrt
. Trudno mi modyfikowaćld
ścieżkę wyszukiwania w takich przypadkachW systemie Linux możesz użyć
ldconfig
, który utrzymuje konfigurację ld.so i pamięć podręczną, aby wydrukować przeszukiwanie katalogów zald.so
pomocąldconfig -v
wypisuje przeszukiwane katalogi przez linker (bez początkowej zakładki) i biblioteki współdzielone znalezione w tych katalogach (z początkową zakładką);grep
dostaje katalogów. Na moim komputerze ta linia jest drukowanaPierwsze ścieżki, bez
hwcap
linii, są albo wbudowane, albo odczytane z /etc/ld.so.conf. Konsolidator może następnie przeszukiwać dodatkowe katalogi w podstawowej ścieżce wyszukiwania biblioteki, z nazwamisse2
odpowiadającymi dodatkowym możliwościom procesora. Te ścieżki,hwcap
w wierszu, mogą zawierać dodatkowe biblioteki dostosowane do tych możliwości procesora.Ostatnia uwaga: użycie
-p
zamiast-v
powyższego przeszukujeld.so
pamięć podręczną.źródło
export LD_LIBRARY_PATH=/some/other/dir
to nie wpłynie to na wyjście tego polecenia ?! Wydaje się, że to nie działa w 100%?LD_LIBRARY_PATH
umożliwiając debugowanie. Np.LD_DEBUG=libs /lib/ld-linux.so --list cat
(Możesz użyć dowolnego pliku wykonywalnego, wybrałemcat
jako pierwszą rzecz, o której przyszło mi do głowy). Może warto żałować za „search path
”. Zauważ, że jeśli masz plik,/etc/ld.so.cache
który pasuje do wszystkich potrzebnych bibliotek, nie zobaczysz wbudowanej ścieżki wyszukiwania systemu, ponieważ nie zajdzie ona tak daleko.gcc
ścieżka wyszukiwania jest taka sama z tymi?Nie jestem pewien, czy istnieje możliwość prostego wydrukowania pełnej efektywnej ścieżki wyszukiwania.
Ale: ścieżka wyszukiwania składa się z katalogów określonych przez
-L
opcje w wierszu poleceń, po których następują katalogi dodane do ścieżki wyszukiwania przezSEARCH_DIR("...")
dyrektywy w skrypcie (-ach) konsolidatora. Więc możesz to rozwiązać, jeśli widzisz oba z nich, co możesz zrobić w następujący sposób:Jeśli wywołujesz
ld
bezpośrednio:-L
opcje są co pan powiedział, że są.--verbose
opcję. PoszukajSEARCH_DIR("...")
dyrektyw, zwykle w górnej części wyniku. (Zauważ, że niekoniecznie są one takie same dla każdego wywołaniald
- konsolidator ma wiele różnych wbudowanych domyślnych skryptów konsolidatora i wybiera między nimi na podstawie różnych innych opcji konsolidatora).Jeśli łączysz przez
gcc
:-v
opcję, abygcc
pokazała, jak wywołuje konsolidator. W rzeczywistości zwykle nie wywołujeld
bezpośrednio, ale pośrednio za pośrednictwem narzędzia o nazwiecollect2
(które znajduje się w jednym z jego wewnętrznych katalogów), które z kolei wywołujeld
. To pokaże Ci, jakie-L
opcje są używane.-Wl,--verbose
dogcc
opcji, aby przejść--verbose
aż do łącznika, aby zobaczyć skrypt linkera, jak opisano powyżej.źródło
-T script
swojego skryptu, całkowicie zastępując domyślny skrypt ld i szukałem tylko wskazanego miejsca.Najbardziej kompatybilne polecenie, jakie znalazłem dla gcc i clang w systemie Linux (dzięki armando.sano):
jeśli podasz
-m32
, wypisze prawidłowe katalogi biblioteki.Przykłady na moim komputerze:
dla
g++ -m64
:dla
g++ -m32
:źródło
Pytanie jest oznaczone jako Linux, ale może to działa również pod Linuksem?
W systemie Mac OS X drukuje:
-Xlinker
Opcjagcc
powyżej prostu przechodzi-v
dold
. Jednak:nie drukuje ścieżki wyszukiwania.
źródło
-Lpath
. Więc odpowiedź @ Raphaël Londeix jest lepsza.Wersja dla komputerów Mac: $ ld -v 2, nie wiem, jak uzyskać szczegółowe ścieżki. wynik
źródło
ld -v 2
ld
. Ludzie z Binutil wyłączyli to w skryptach kompilacji. Od lat jest wyłączony.