Wie werden die Suchpfade gedruckt, nach denen gesucht wird? ld in der Reihenfolge, in der gesucht wird.
Unter Linux können Sie ldconfig
verwenden, das die ld.so-Konfiguration und den Cache verwaltet, um die Verzeichnissuche mit ld.so
Auszudrucken
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
Druckt die Verzeichnissuche mit dem Linker (ohne führende Registerkarte) und die in diesen Verzeichnissen gefundenen gemeinsam genutzten Bibliotheken (mit führender Registerkarte) aus. Das grep
ruft die Verzeichnisse ab. Auf meinem Computer wird diese Zeile gedruckt
/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)
Die ersten Pfade ohne hwcap
in der Zeile sind entweder integriert oder werden aus /etc/ld.so.conf gelesen. Der Linker kann dann zusätzliche Verzeichnisse unter dem Suchpfad der Basisbibliothek durchsuchen, wobei Namen wie sse2
Zusätzlichen CPU-Fähigkeiten entsprechen. Diese Pfade mit hwcap
in der Zeile können zusätzliche Bibliotheken enthalten, die auf diese CPU-Fähigkeiten zugeschnitten sind.
Ein letzter Hinweis: Wenn Sie -p
Anstelle von -v
Verwenden, wird stattdessen der ld.so
- Cache durchsucht.
Sie können dies tun, indem Sie den folgenden Befehl ausführen:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc übergibt dem Linker einige zusätzliche -L-Pfade, die Sie mit dem folgenden Befehl auflisten können:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
Die Antworten, die die Verwendung von ld.so.conf und ldconfig vorschlagen, sind nicht korrekt, da sie sich auf die Pfade beziehen, die vom dynamischen Laufzeit-Linker (dh, wenn ein Programm ausgeführt wird) durchsucht wurden, und die nicht mit dem Pfad übereinstimmen, der von ld (dh wann immer ein Programm verlinkt ist).
Ich bin nicht sicher, ob es eine Möglichkeit gibt, einfach den vollständigen effektiven Suchpfad auszudrucken.
Aber: Der Suchpfad besteht aus Verzeichnissen, die in der Befehlszeile mit den Optionen -L
Angegeben wurden, gefolgt von Verzeichnissen, die dem Suchpfad mit den Anweisungen SEARCH_DIR("...")
in den Linker-Skripten hinzugefügt wurden. Sie können es also herausfinden, wenn Sie beide sehen, was Sie wie folgt tun können:
Wenn Sie ld
direkt aufrufen:
-L
- Optionen entsprechen den Angaben, die Sie gemacht haben.--verbose
Hinzu. Suchen Sie nach den Anweisungen SEARCH_DIR("...")
, normalerweise oben in der Ausgabe. (Beachten Sie, dass diese nicht unbedingt für jeden Aufruf von ld
gleich sind - der Linker verfügt über eine Reihe verschiedener integrierter Standard-Linker-Skripte und wählt basierend auf verschiedenen anderen Linker-Optionen aus.)Wenn Sie über gcc
verlinken:
-v
An gcc
übergeben, damit angezeigt wird, wie der Linker aufgerufen wird. Tatsächlich wird ld
normalerweise nicht direkt aufgerufen, sondern indirekt über ein Tool namens collect2
(Das sich in einem seiner internen Verzeichnisse befindet), das wiederum ld
aufruft. Hier sehen Sie, welche -L
- Optionen verwendet werden.-Wl,--verbose
Zu den gcc
-Optionen hinzufügen, um --verbose
An den Linker weiterzuleiten, damit das Linker-Skript wie oben beschrieben angezeigt wird.Der kompatibelste Befehl, den ich für gcc und clang unter Linux gefunden habe (dank armando.sano):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
wenn du gibst -m32
, es werden die korrekten Bibliotheksverzeichnisse ausgegeben.
Beispiele auf meiner Maschine:
zum 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
zum 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
Die Frage ist Linux, aber vielleicht funktioniert das auch unter Linux?
gcc -Xlinker -v
Unter Mac OS X wird Folgendes gedruckt:
@(#)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/
[...]
Das -Xlinker
Option von gcc
übergibt nur -v
bis ld
. Jedoch:
ld -v
suchpfad wird nicht gedruckt.
Mac-Version: $ ld -v 2, weiß nicht, wie man detaillierte Pfade abruft. Ausgabe
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/