web-dev-qa-db-de.com

So drucken Sie den ld-Suchpfad (Linker)

Wie werden die Suchpfade gedruckt, nach denen gesucht wird? ld in der Reihenfolge, in der gesucht wird.

139
Talespin_Kit

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.

76
telotortium

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

74
faken

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:

  • Die -L - Optionen entsprechen den Angaben, die Sie gemacht haben.
  • Um das Linker-Skript anzuzeigen, fügen Sie die Option --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:

  • Sie können die Option -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.
  • Sie können -Wl,--verbose Zu den gcc -Optionen hinzufügen, um --verbose An den Linker weiterzuleiten, damit das Linker-Skript wie oben beschrieben angezeigt wird.
65

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
26

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.

5
armando.sano

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/
1
yfeleke