Jaki jest sposób wydrukowania ścieżek wyszukiwania, które w kolejności wyszukiwania były wyświetlane przez ld .
Jaki jest sposób wydrukowania ścieżek wyszukiwania, które w kolejności wyszukiwania były wyświetlane przez ld .
Odpowiedzi:
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).
ld
ścieżki wyszukiwania. Na przykład czasami muszę skompilować kod źródłowy makefile
lub wygenerować plik makefile ze configure
skryptu lub z CMakeLists.txt
lub nawet bardziej skomplikowanych, takich jak vala
lub srt
. Trudno mi modyfikować ld
ścieżkę wyszukiwania w takich przypadkach
W systemie Linux możesz użyć ldconfig
, który utrzymuje konfigurację ld.so i pamięć podręczną, aby wydrukować przeszukiwanie katalogów za ld.so
pomocą
ldconfig -v 2>/dev/null | grep -v ^$'\t'
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 drukowana
/usr/lib64/atlas:
/usr/lib/llvm:
/usr/lib64/llvm:
/usr/lib64/mysql:
/usr/lib64/nvidia:
/usr/lib64/tracker-0.12:
/usr/lib/wine:
/usr/lib64/wine:
/usr/lib64/xulrunner-2:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/usr/lib64/nvidia/tls: (hwcap: 0x8000000000000000)
/lib/i686: (hwcap: 0x0008000000000000)
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)
Pierwsze ś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 nazwami sse2
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 przeszukuje ld.so
pamięć podręczną.
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łem cat
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 przez SEARCH_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ę. Poszukaj SEARCH_DIR("...")
dyrektyw, zwykle w górnej części wyniku. (Zauważ, że niekoniecznie są one takie same dla każdego wywołania ld
- 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ę, aby gcc
pokazała, jak wywołuje konsolidator. W rzeczywistości zwykle nie wywołuje ld
bezpośrednio, ale pośrednio za pośrednictwem narzędzia o nazwie collect2
(które znajduje się w jednym z jego wewnętrznych katalogów), które z kolei wywołuje ld
. To pokaże Ci, jakie -L
opcje są używane.-Wl,--verbose
do gcc
opcji, aby przejść --verbose
aż do łącznika, aby zobaczyć skrypt linkera, jak opisano powyżej.-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):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
jeśli podasz -m32
, wypisze prawidłowe katalogi biblioteki.
Przykłady na moim komputerze:
dla g++ -m64
:
/usr/x86_64-linux-gnu/lib64
/usr/i686-linux-gnu/lib64
/usr/local/lib/x86_64-linux-gnu
/usr/local/lib64
/lib/x86_64-linux-gnu
/lib64
/usr/lib/x86_64-linux-gnu
/usr/lib64
/usr/local/lib
/lib
/usr/lib
dla g++ -m32
:
/usr/i686-linux-gnu/lib32
/usr/local/lib32
/lib32
/usr/lib32
/usr/local/lib/i386-linux-gnu
/usr/local/lib
/lib/i386-linux-gnu
/lib
/usr/lib/i386-linux-gnu
/usr/lib
Pytanie jest oznaczone jako Linux, ale może to działa również pod Linuksem?
gcc -Xlinker -v
W systemie Mac OS X drukuje:
@(#)PROGRAM:ld PROJECT:ld64-224.1
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 armv6m armv7m armv7em
Library search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
Framework search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/
[...]
-Xlinker
Opcja gcc
powyżej prostu przechodzi -v
do ld
. Jednak:
ld -v
nie drukuje ścieżki wyszukiwania.
-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
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld
. Ludzie z Binutil wyłączyli to w skryptach kompilacji. Od lat jest wyłą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?