Jaki jest sposób drukowania ścieżek wyszukiwania, które wyglądały przez ld w kolejności wyszukiwania.Jak wydrukować ścieżkę przeszukiwania ld (linker)?
Odpowiedz
Nie jestem pewien, czy istnieje opcja drukowania po prostu pełnej efektywnej ścieżki wyszukiwania.
Ale: ścieżka wyszukiwania składa się z katalogów określonych przez -L
opcji w linii poleceń, a następnie katalogów dodanych do ścieżki wyszukiwania przez dyrektywy SEARCH_DIR("...")
w skrypcie linkera. Więc można się dogadać, jeśli można zobaczyć zarówno tych, które można zrobić w następujący sposób:
Jeśli powołując ld
bezpośrednio:
- The
-L
opcji są co pan powiedział, że są . - Aby wyświetlić skrypt linkera, dodaj opcję
--verbose
. Poszukaj dyrektywSEARCH_DIR("...")
, zwykle w górnej części wyjścia. (Zauważ, że te niekoniecznie są takie same dla wszystkich wezwaniemld
- łącznik ma wiele różnych wbudowanych domyślnych skryptów linkera i wybiera między nimi w oparciu o różne inne opcje linkera.)
Jeśli „re łączenie poprzez gcc
:
- można przekazać opcję
gcc
-v
tak, że pokazuje, jak to wywołuje łącznik. W rzeczywistości zwykle nie wywołuje bezpośrednio, ale pośrednio, poprzez narzędzie o nazwiecollect2
(które znajduje się w jednym z jego wewnętrznych katalogów), co z kolei wywołujeld
. To pokazuje, które opcje są używane. - Możesz dodać
-Wl,--verbose
do opcjigcc
, aby przekazać--verbose
do łącznika, aby zobaczyć skrypt linkera, jak opisano powyżej.
W systemie Linux można użyć ldconfig
, który utrzymuje konfigurację ld.so i cache, aby wydrukować przeszukiwanie katalogów przez ld.so
z
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
wypisuje przeszukiwane katalogi przez łącznik (bez głównej zakładki) i wspólnych bibliotek znalezionych w tych katalogach (z wiodącą zakładką); grep
otrzymuje katalogi. Na moim komputerze, ta linia wypisuje
/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
w kolejce, albo są wbudowane lub odczytać z /etc/ld.so.conf. Łącznik może następnie przeszukiwać dodatkowe katalogi pod podstawową ścieżką przeszukiwania biblioteki o nazwach takich jak sse2
, odpowiadających dodatkowym możliwościom procesora. Te ścieżki, z hwcap
w linii, mogą zawierać dodatkowe biblioteki dostosowane do tych możliwości procesora.
Ostatnia uwaga: zamiast tego używa się -p
zamiast -v
przeszukując pamięć podręczną ld.so
.
Można to zrobić wykonując następujące polecenia:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc przechodzi kilka dodatkowych -L ścieżki do łącznika, który możesz wymienić 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 są niepoprawne, ponieważ odnoszą się do ścieżek wyszukanych przez dynamiczny linker środowiska wykonawczego (tj. Gdy program jest wykonywany), który nie jest tym samym, co ścieżka przeszukiwana przez ld (tj. kiedykolwiek program jest połączony).
Trafiłeś w miejsce. Mam problem z łączeniem, podczas linkowania linker odnajduje ręcznie zainstalowane biblioteki w '/ usr/local/..', które powodują brak błędu biblioteki, a łączenie kończy się niepowodzeniem. Muszę zmienić nazwę '/ usr/local' za każdym razem, aby wykluczyć tę ścieżkę wyszukiwania. Czy istnieje prosty sposób na wykluczenie lub przesłonięcie ścieżki '/ usr/local'? – kenn
Możesz spróbować ręcznie określić ścieżki biblioteki za pomocą opcji -L do GCC, co moim zdaniem (nie jestem pewien) zastąpi ścieżki biblioteki systemowej. Możesz także spróbować ustawić zmienną env LIBRARY_PATH przed kompilacją: $ LIBRARY_PATH =/somedir/gcc ... – faken
Znam to łączenie w kompilacji z wiersza poleceń. Miałem na myśli globalny sposób na przesłonięcie ścieżki wyszukiwania 'ld'. Na przykład czasami muszę skompilować kod źródłowy z 'makefile' lub generować plik Makefile ze skryptu' configure' lub '' CMakeLists.txt' lub nawet bardziej skomplikowane, takie jak 'vala' lub' srt'. Trudno jest mi zmienić ścieżkę wyszukiwania 'ld' w takich przypadkach. – kenn
Pytanie jest oznaczone jako Linux, ale może to działa również pod Linuksem?
gcc -Xlinker -v
W systemie Mac OS X, to 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/
[...]
Opcja -Xlinker
z gcc
powyżej właśnie przechodzi -v
do ld
. Jednak:
ld -v
nie drukuje ścieżki wyszukiwania.
W systemie Linux drukuje również katalogi, ale w postaci '-Lpath'. Tak więc odpowiedź @ Raphaëla Londeixa jest lepsza. – pevik
najbardziej kompatybilny komenda Znalazłem dla gcc i brzękiem na Linuksie (dzięki armando.sano):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
jeśli dasz -m32
, to wyświetli odpowiednie katalogi biblioteczne.
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
Dziękujemy! malusieńki - pozbyć się grep lub dwóch: sed -n 's/SEARCH_DIR ("= \? \ ([^"] \ + \) "); */\ 1 \ n/gp' –
wersja Mac: $ ld -v 2, nie wiem, jak uzyskać szczegółowe ścieżki. wyjście
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
- 1. Czy lld linker jest zamiennikiem zamiennym dla ld i złota?
- 2. Linker Error: gcc
- 3. eksperymentalny :: linker systemu plików
- 4. AIX 5.3 (ld-XLC) równoważne opcja Linux (ld-gcc) -rpath
- 5. Jak przełączyć domyślne opcje GCC na linker?
- 6. jak wydrukować zawartość PYTHONPATH
- 7. Niestandardowy linker do projektu Xcode z szybkim
- 8. Flaga -ObjC linker powoduje duplikowanie błędów symboli
- 9. Apple Mach-O Linker błąd armv7s & libGoogleAdMobAds.a
- 10. Xcode 5 iOS 7 CocoaPods Linker Error
- 11. Błąd Linker w Xcode 4.2 Podgląd programisty
- 12. Złoto linker ld.gold -plugin: nieznana opcja
- 13. Błąd GHUnit Linker z klasami aplikacji
- 14. Linker error: niezdefiniowane odniesienia do symbolu 'pthread_rwlock_trywrlock @@ GLIBC_2.2.5'
- 15. Wdrażanie przeszukiwania wstecznego z heurystyką?
- 16. Nie znaleziono linku ostrzegawczego Apple Mach-O Linker
- 17. Przekazywanie danych do przeszukiwania aktywności
- 18. clang ++ 3.2 linker nie znajduje C++ stdlib
- 19. Wymuś linker GNU do wygenerowania 32-bitowych plików wykonywalnych ELF
- 20. Jak wydrukować jeden bit?
- 21. Jak wydrukować plik JSON?
- 22. Jak wydrukować zmienną $ rootScope?
- 23. Jak wydrukować zawartość TextBox
- 24. Jak wydrukować parametry?
- 25. Jak wydrukować adres funkcji?
- 26. WMI Linker Error na x64
- 27. ld: biblioteka nie została znaleziona dla -lGoogleToolboxForMac
- 28. Czy Ant może wydrukować ścieżkę klas dla konkretnego celu? Jeśli tak to jak?
- 29. Linker Error: iPhone Test jednostki Bundle przedstawieniu klasy aplikacji
- 30. ld: 1 symbol duplikatu dla architektury x86_64
Opcja --verbose dla łącznika zrobiła lewę. Bardzo pomocne! – Ari
Starałem się, aby dowiedzieć się, gdzie linker szukał i nie znaleziono SEARCH_DIR w danych wyjściowych. Okazuje się, że gdy używałem '-T script', mój skrypt całkowicie zastąpił domyślny skrypt ld i wyglądał tylko tam, gdzie wskazałem. – thomasa88