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.