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 makefilelub wygenerować plik makefile ze configureskryptu lub z CMakeLists.txtlub nawet bardziej skomplikowanych, takich jak valalub 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.sopomocą
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -vwypisuje przeszukiwane katalogi przez linker (bez początkowej zakładki) i biblioteki współdzielone znalezione w tych katalogach (z początkową zakładką); grepdostaje 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 hwcaplinii, 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 sse2odpowiadającymi dodatkowym możliwościom procesora. Te ścieżki, hwcapw wierszu, mogą zawierać dodatkowe biblioteki dostosowane do tych możliwości procesora.
Ostatnia uwaga: użycie -pzamiast -vpowyższego przeszukuje ld.sopamięć podręczną.
export LD_LIBRARY_PATH=/some/other/dirto nie wpłynie to na wyjście tego polecenia ?! Wydaje się, że to nie działa w 100%?
LD_LIBRARY_PATHumożliwiając debugowanie. Np. LD_DEBUG=libs /lib/ld-linux.so --list cat(Możesz użyć dowolnego pliku wykonywalnego, wybrałem catjako 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.cachektó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 -Lopcje 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 ldbezpośrednio:
-Lopcje są co pan powiedział, że są.--verboseopcję. 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:
-vopcję, aby gccpokazała, jak wywołuje konsolidator. W rzeczywistości zwykle nie wywołuje ldbezpoś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 -Lopcje są używane.-Wl,--verbosedo gccopcji, aby przejść --verboseaż do łącznika, aby zobaczyć skrypt linkera, jak opisano powyżej.-T scriptswojego 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/
[...]
-XlinkerOpcja gccpowyżej prostu przechodzi -vdo 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/localkaż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?