Wie werden die Suchpfade, die von ld gesucht wurden, in der Reihenfolge gedruckt, in der sie gesucht werden ?
Wie werden die Suchpfade, die von ld gesucht wurden, in der Reihenfolge gedruckt, in der sie gesucht werden ?
Antworten:
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 Laufzeitlinker durchsucht werden (dh wann immer ein Programm ausgeführt wird), was nicht mit dem von ld gesuchten Pfad (dh wann immer) identisch ist ein Programm ist verlinkt).
ld
Suchpfad zu überschreiben . Zum Beispiel manchmal muß ich einen Quellcode kompiliert makefile
aus oder Erzeugen Makefile - configure
Skript oder aus CMakeLists.txt
oder auch komplizierteren wie vala
oder srt
. ld
In solchen Fällen
Unter Linux können Sie verwenden ldconfig
, die die ld.so Konfiguration und Cache hält, suchen die Verzeichnisse auszudrucken durch ld.so
mit
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
druckt die Verzeichnissuche durch den Linker (ohne führenden Tab) und die in diesen Verzeichnissen gefundenen gemeinsam genutzten Bibliotheken (mit einem führenden Tab) aus; das grep
bekommt die Verzeichnisse. Auf meinem Computer wird diese Zeile ausgedruckt
/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, deren Namen sse2
zusätzlichen CPU-Funktionen entsprechen. Diese Pfade hwcap
in der Zeile können zusätzliche Bibliotheken enthalten, die auf diese CPU-Funktionen zugeschnitten sind.
Ein letzter Hinweis: Verwenden von -p
anstelle von -v
oben durchsucht ld.so
stattdessen den Cache.
export LD_LIBRARY_PATH=/some/other/dir
dieses Befehls nicht beeinflusst wird , wenn ich sie einstelle?! Scheint es nicht 100% zu funktionieren?
LD_LIBRARY_PATH
indem Sie das Debuggen aktivieren. ZB LD_DEBUG=libs /lib/ld-linux.so --list cat
(Sie können jede ausführbare Datei verwenden, die ich cat
als erstes ausgewählt habe). Könnte es wert sein, nach " search path
" zu greifen . Beachten Sie, /etc/ld.so.cache
dass Sie den integrierten System-Suchpfad nicht sehen können , wenn Sie eine haben , die allen benötigten Bibliotheken entspricht, da diese nicht so weit kommt.
gcc
Suchpfad bei diesen gleich?
Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, einfach den vollständigen effektiven Suchpfad zu drucken.
Aber: Der Suchpfad besteht aus Verzeichnissen, die durch -L
Optionen in der Befehlszeile angegeben werden, gefolgt von Verzeichnissen, die dem Suchpfad durch SEARCH_DIR("...")
Anweisungen in den Linkerskripten hinzugefügt werden . Sie können es also herausfinden, wenn Sie beide sehen, was Sie wie folgt tun können:
Wenn Sie ld
direkt aufrufen :
-L
Optionen sind alles, was Sie gesagt haben.--verbose
Option hinzu, um das Linker-Skript anzuzeigen. Suchen Sie nach den SEARCH_DIR("...")
Anweisungen, normalerweise oben in der Ausgabe. (Beachten Sie, dass diese nicht unbedingt für jeden Aufruf von gleich sind ld
- der Linker verfügt über eine Reihe verschiedener integrierter Standard-Linker-Skripte und wählt basierend auf verschiedenen anderen Linker-Optionen zwischen diesen aus.)Wenn Sie über Folgendes verlinken gcc
:
-v
Option an übergeben, gcc
damit sie Ihnen zeigt, wie der Linker aufgerufen wird. Tatsächlich wird es normalerweise nicht ld
direkt, sondern indirekt über ein Tool namens collect2
(das sich in einem seiner internen Verzeichnisse befindet) aufgerufen , das wiederum aufruft ld
. Das zeigt Ihnen, welche -L
Optionen verwendet werden.-Wl,--verbose
die gcc
Optionen hinzufügen , damit sie --verbose
an den Linker weitergeleitet werden, um das Linkerskript wie oben beschrieben anzuzeigen.-T script
meinem Skript das Standard-Skript von ld vollständig ersetzt und nur dort gesucht habe, wo ich darauf hingewiesen habe.
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 Sie angeben -m32
, werden die richtigen Bibliotheksverzeichnisse ausgegeben.
Beispiele auf meiner Maschine:
für 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
für 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 lautet 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/
[...]
Die -Xlinker
Option von gcc
oben geht nur -v
auf über ld
. Jedoch:
ld -v
druckt den Suchpfad nicht aus.
-Lpath
. Also @ Raphaël Londeix Antwort ist besser.
Mac-Version: $ ld -v 2, weiß nicht, wie man detaillierte Pfade erhält. Ausgabe
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld
. Die Binutil-Leute haben es in den Build-Skripten deaktiviert. Es ist seit Jahren deaktiviert.
/usr/local/..
die einen fehlenden Bibliotheksfehler verursachen, und die Verknüpfung schlägt fehl. Ich muss/usr/local
jedes Mal umbenennen , um diesen Suchpfad auszuschließen. Gibt es eine einfache Möglichkeit, einen/usr/local
Pfad auszuschließen oder zu überschreiben ?