In che modo stampare i percorsi di ricerca visualizzati in ld nell'ordine in cui esegue la ricerca.Come stampare il percorso di ricerca ld (linker)
risposta
Non sono sicuro che sia disponibile un'opzione per la semplice stampa del percorso di ricerca efficace.
Ma: il percorso di ricerca è costituito da directory specificate dalle opzioni -L
nella riga di comando, seguite dalle directory aggiunte al percorso di ricerca dalle direttive SEARCH_DIR("...")
negli script del linker. Così si può lavorare fuori se si può vedere sia di quelli, che si può fare come segue:
Se stai invocano ld
direttamente:
- Le
-L
opzioni sono tutto quello che hai detto che sono . - Per visualizzare lo script del linker, aggiungere l'opzione
--verbose
. Cerca le direttiveSEARCH_DIR("...")
, in genere nella parte superiore dell'output. (Si noti che questi non sono necessariamente le stesse per ogni invocazioneld
- il linker ha un certo numero di diversi script del linker di default built-in, e sceglie tra di loro in base a varie altre opzioni del linker.)
Se 're che collega via gcc
:
- è possibile passare l'opzione
-v
-gcc
in modo che vi mostra come si invoca il linker. Di fatto, normalmente non invoca lold
direttamente, ma indirettamente tramite uno strumento chiamatocollect2
(che risiede in una delle sue directory interne), che a sua volta invocald
. Questo ti mostrerà quali sono le opzioni-L
utilizzate. - È possibile aggiungere
-Wl,--verbose
alle opzionigcc
per passare a--verbose
tramite il linker, per visualizzare lo script del linker come descritto sopra.
Su Linux, è possibile utilizzare ldconfig
, che mantiene la configurazione ld.so e la cache, per stampare la ricerca di directory da ld.so
con
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
stampa il di ricerca directory dal linker (senza una scheda iniziale) e le librerie condivise trovate in quelle directory (con una scheda iniziale); il grep
ottiene le directory. Sulla mia macchina, questa linea di stampa le
/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)
I primi percorsi, senza hwcap
nella linea, sono o built-in o leggere da /etc/ld.so.conf. Il linker può quindi cercare ulteriori directory nel percorso di ricerca della libreria di base, con nomi come sse2
corrispondenti a capacità aggiuntive della CPU. Questi percorsi, con hwcap
nella riga, possono contenere librerie aggiuntive personalizzate per queste funzionalità della CPU.
Un'ultima nota: utilizzando -p
anziché -v
sopra, viene invece ricercata la cache ld.so
.
È possibile farlo eseguendo il comando seguente:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc passa a pochi percorsi -L in più per il linker, che è possibile elencare con il seguente comando:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
Le risposte che suggeriscono di usare ld.so.conf e ldconfig non sono corrette perché si riferiscono ai percorsi cercati dal linker dinamico di runtime (cioè ogni volta che viene eseguito un programma), che non è uguale al percorso cercato da ld (ad es. ogni volta che un programma è collegato).
Hai centrato il bersaglio. Ho un problema di collegamento, durante il processo di collegamento il linker trova le librerie installate manualmente in '/ usr/local/..' che causa l'errore di libreria mancante, e il collegamento fallisce. Devo rinominare '/ usr/local' ogni volta per escludere quel percorso di ricerca. Esiste un modo semplice per escludere o sovrascrivere il percorso '/ usr/local'? – kenn
Si può provare a specificare manualmente i percorsi della libreria con l'opzione -L su GCC, che a mio avviso (non sicuro) sovrascriverà i percorsi della libreria di sistema. Si potrebbe anche provare a impostare la variabile ENV LIBRARY_PATH prima della compilazione: $ LIBRARY_PATH =/somedir/gcc ... – faken
So che il collegamento nella compilazione della riga di comando. Intendevo un modo globale per scavalcare il percorso di ricerca di 'ld's. Per esempio a volte devo compilare un codice sorgente da 'makefile' o generare makefile dallo script' configure' o da 'CMakeLists.txt' o anche più complicati come' vala' o 'srt'. È difficile per me modificare il percorso di ricerca 'ld' in questi casi – kenn
La domanda è codificata con Linux, ma forse funziona anche su Linux?
gcc -Xlinker -v
In Mac OS X, questo stampe:
@(#)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/
[...]
L'opzione -Xlinker
di gcc
sopra passa appena -v
-ld
. Tuttavia:
ld -v
non stampa il percorso di ricerca.
Su Linux stampa anche le directory, ma in forma di '-Lpath'. Quindi la risposta @ Raphaël Londeix è migliore. – pevik
Il comando più compatibile che ho trovato per gcc e clang su Linux (grazie a armando.sano):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
se si dà -m32
, il risultato sarà la directory di libreria corretti.
Esempi sulla mia macchina:
per 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
per 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
Grazie! miglioramento giovanile - sbarazzarsi di un grep o due: sed -n '/ SEARCH_DIR ("= \? \ ([^"] \ + \) "); */\ 1 \ n/gp' –
versione per Mac: $ ld -v 2, non so come ottenere dettagliate percorsi. output
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
L'opzione --verbose per il linker ha funzionato. Molto utile! – Ari
Stavo cercando di capire dove si trovava il linker e non ho trovato SEARCH_DIR nell'output. Risulta che mentre stavo usando lo script '-T' il mio script ha completamente sostituito lo script predefinito di ld e ha solo guardato dove ho indicato. – thomasa88