Wie werden die Suchpfade, die von ld gesucht wurden, in der Reihenfolge gedruckt, in der sie gesucht werden ?
153
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).
/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 ?ld
Suchpfad zu überschreiben . Zum Beispiel manchmal muß ich einen Quellcode kompiliertmakefile
aus oder Erzeugen Makefile -configure
Skript oder ausCMakeLists.txt
oder auch komplizierteren wievala
odersrt
.ld
In solchen FällenUnter Linux können Sie verwenden
ldconfig
, die die ld.so Konfiguration und Cache hält, suchen die Verzeichnisse auszudrucken durchld.so
mitldconfig -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; dasgrep
bekommt die Verzeichnisse. Auf meinem Computer wird diese Zeile ausgedrucktDie 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 Namensse2
zusätzlichen CPU-Funktionen entsprechen. Diese Pfadehwcap
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 durchsuchtld.so
stattdessen den Cache.quelle
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. ZBLD_DEBUG=libs /lib/ld-linux.so --list cat
(Sie können jede ausführbare Datei verwenden, die ichcat
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 durchSEARCH_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 denSEARCH_DIR("...")
Anweisungen, normalerweise oben in der Ausgabe. (Beachten Sie, dass diese nicht unbedingt für jeden Aufruf von gleich sindld
- 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 nichtld
direkt, sondern indirekt über ein Tool namenscollect2
(das sich in einem seiner internen Verzeichnisse befindet) aufgerufen , das wiederum aufruftld
. Das zeigt Ihnen, welche-L
Optionen verwendet werden.-Wl,--verbose
diegcc
Optionen hinzufügen , damit sie--verbose
an den Linker weitergeleitet werden, um das Linkerskript wie oben beschrieben anzuzeigen.quelle
-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):
Wenn Sie angeben
-m32
, werden die richtigen Bibliotheksverzeichnisse ausgegeben.Beispiele auf meiner Maschine:
für
g++ -m64
:für
g++ -m32
:quelle
Die Frage lautet Linux, aber vielleicht funktioniert das auch unter Linux?
Unter Mac OS X wird Folgendes gedruckt:
Die
-Xlinker
Option vongcc
oben geht nur-v
auf überld
. Jedoch:druckt den Suchpfad nicht aus.
quelle
-Lpath
. Also @ Raphaël Londeix Antwort ist besser.Mac-Version: $ ld -v 2, weiß nicht, wie man detaillierte Pfade erhält. Ausgabe
quelle
ld -v 2
ld
. Die Binutil-Leute haben es in den Build-Skripten deaktiviert. Es ist seit Jahren deaktiviert.