Scopri se la libreria è nel percorso


14

Supponendo di voler verificare se una libreria è installata e utilizzabile da un programma. Posso usare ldconfig -p | grep mylibper scoprire se è installato sul sistema. ma cosa succede se la libreria è nota solo tramite l'impostazione LD_LIBRARY_PATH?

In tal caso, il programma potrebbe essere in grado di trovare la libreria, ma ldconfignon lo farà. Come posso verificare se la libreria si trova nel percorso del linker combinato ?

Aggiungerò che sto cercando una soluzione che funzioni anche se in realtà non ho il programma a portata di mano (ad esempio il programma non è ancora stato compilato), voglio solo sapere che esiste una certa libreria in ld" percorsi di s.


2
È possibile utilizzare ldd <binary>per verificare se tutte le librerie collegate sono nel percorso. Forse c'è un modo più elegante.
Thomas,

@Thomas Penso che dovresti rispondere al tuo commento. lddserve esattamente a questo scopo.
lgeorget,

1
@Thomas - ma se il programma non fosse ancora compilato e quella libreria fosse necessaria per la compilazione?
nbubis,

@Igeorget - vedi la mia modifica / commento
nbubis,

@nbubis: quando hai bisogno della libreria per la compilazione, devi normalmente usare LIBRARY_PATHla variabile d'ambiente che viene cercata ad esempio dal gcccompilatore. La LIBRARY_PATHvariabile d'ambiente ha anche un elenco separato da due punti di directory.
Thomas,

Risposte:


14

ldconfig può elencare tutte le librerie a cui ha accesso. Queste librerie sono anche memorizzate nella sua cache.

/sbin/ldconfig -v -Neseguirà la scansione di tutti i normali percorsi delle librerie, elencherà tutte le librerie disponibili, senza ricostruire la cache (il che non è possibile se si è un utente non root). NON tiene conto delle librerie in LD_LIBRARY_PATH (contrariamente a quanto detto da questo post prima della modifica) ma è possibile passare ulteriori librerie alla riga di comando utilizzando la riga seguente:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

ldconfig è uno strumento degli anni '80 che è stato abbandonato negli anni '90. Per questo motivo, ldconfignon è portatile in quanto si applica solo alle implementazioni basate sul a.outlinker dinamico basato su SunOS-4.0 del 1987.
schily

In che modo aiuta a elencare le librerie che sono solo su LD_LIBRARY_PATH? Immagino di poter scrivere una sceneggiatura per analizzarla e poi leggerla tramite ldconfig, ma sembra un po 'come un'eccessiva uccisione.
nbubis,

1
@nububi è sempre possibile passare le librerie in LD_LIBRARY_PATH a ldconfig. Come /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)non troppo di un peso inutile per i miei gusti.
lgeorget,

@schily Davvero? Funziona abbastanza bene con le librerie ELF per quanto ne so. Ed è ancora usato, ld.so si basa sulla cache creata da ldconfig.
lgeorget,

Le persone Linux hanno violato il vecchio codice sorgente del linker Sun per supportare ELF. La nuova implementazione ELF di Sun è stata rimossa ldconfigin un accordo con AT&T poiché la cache del linker era troppo sensibile agli errori. Sun poi aggiunto the tree stooges: moe, larie crlecome programmi di supporto per la gestione ELF.
schily

2

Sostituisci globalmente (spazio) :con LD_LIBRARY_PATH

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

2

Puoi compilare un semplice programma di test con gcc e collegare la tua libreria. Quindi è possibile controllare le librerie utilizzate con ldd. Uso qualcosa del genere:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed impedisce al linker di scartare la libreria, poiché non vengono utilizzati simboli dalla libreria.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.