Jak wydrukować ścieżkę wyszukiwania ld (linker)

153

Jaki jest sposób wydrukowania ścieżek wyszukiwania, które w kolejności wyszukiwania były wyświetlane przez ld .

Talespin_Kit
źródło

Odpowiedzi:

96

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).

fałszywy
źródło
2
Udało Ci się. Mam problem z linkowaniem, podczas procesu linkowania linker znajduje ręcznie zainstalowane biblioteki, w /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?
kenn
1
Możesz spróbować ręcznie określić ścieżki bibliotek z opcją -L do GCC, co myślę (nie jestem pewien) nadpisuje ścieżki bibliotek systemowych. Możesz także spróbować ustawić zmienną env LIBRARY_PATH przed kompilacją: $ LIBRARY_PATH = / somedir / gcc ...
faken
1
Znam to łączenie w kompilacji z wiersza poleceń. Miałem na myśli globalny sposób na zastąpienie 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
kenn
Używając CMake, możesz wybrać dokładnie biblioteki, które są używane podczas fazy konfiguracji (niektóre z tych wpisów są wyświetlane tylko w trybie zaawansowanym). Jeśli chodzi o konfigurację skryptów z Autotools, zobacz tę odpowiedź: stackoverflow.com/questions/7561509/… . To nie jest bezpośrednią odpowiedzią na twoje pytanie, ale może pomóc ci zrobić to, co chcesz.
sfałszowany
82

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ą.

telotortium
źródło
51
Pyta o konsolidator (ld), a nie program ładujący (ld.so)!
fons
3
Jak to możliwe, że jeśli ustawię 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%?
TMS
3
@fons Zabawne jest to, że przyszedłem tutaj, szukając tej odpowiedzi. :) czas łącza czy ścieżka czasu wykonania? Myślę, że to jest pytanie. LIBRAY_PATH (czas łącza) vs LD_LIBRARY_PATH.
Daniel Santos
2
Zauważyłem na niektórych platformach (np. Ramię z łańcuchem narzędzi Linaro), że ldconfig w rzeczywistości nie przeszukuje tych samych katalogów, co konsolidator czasu wykonywania. Państwo może zmusić go do wyjścia swoją ścieżkę przeszukiwania i obejmują ścieżki od 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.
John O'M.
Czy gccścieżka wyszukiwania jest taka sama z tymi?
nn0p,
68

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:

  • Te -Lopcje są co pan powiedział, że są.
  • Aby zobaczyć skrypt konsolidatora, dodaj --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:

  • Możesz przekazać tę -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.
  • Można dodać -Wl,--verbosedo gccopcji, aby przejść --verboseaż do łącznika, aby zobaczyć skrypt linkera, jak opisano powyżej.
Matthew Slattery
źródło
5
Opcja --verbose dla konsolidatora załatwiła sprawę. Bardzo pomocne!
Ari
Bardzo się starałem ustalić, gdzie szukał konsolidator, ale nie znalazłem SEARCH_DIR w danych wyjściowych. Okazuje się, że używałem -T scriptswojego skryptu, całkowicie zastępując domyślny skrypt ld i szukałem tylko wskazanego miejsca.
thomasa88
30

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
Raphaël Londeix
źródło
Dziękuję Ci! poprawienie malusieńki - pozbądź się jednego lub dwóch grepa: sed -n 's / SEARCH_DIR ("= \? ([^"] \ +) "); * / \ 1 \ n / gp'
Bruce K
2
Dlaczego wymaga to tak niejasnej metody?
bmacnaughton
To zadziałało jak urok! jak dodajemy katalogi na tej liście, ścieżkę wyszukiwania linkera?
pari
6

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.

armando.sano
źródło
W Linuksie drukuje również katalogi, ale w postaci -Lpath. Więc odpowiedź @ Raphaël Londeix jest lepsza.
pevik
2

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/
yfeleke
źródło
3
Otrzymuję komunikat „nie można otworzyć 2: nie ma takiego pliku lub katalogu”. Bieganield -v 2
Jack
2
Pytanie jest oznaczone jako Linux, a nie OS X. Nie wierzę, że OS X używa GNU ld. Ludzie z Binutil wyłączyli to w skryptach kompilacji. Od lat jest wyłączony.
jww