2009-10-05 4 views
6

Esiste un modo semplice ed efficace per sapere che una data in modo dinamico legato ELF manca una richiesta .so per l'esecuzione, tutti dalla all'interno di un Programma C/C++?linux/gcc: funzionalità ldd dall'interno di un C/programma C++

Ho bisogno di un programma con funzionalità un po 'simili a ldd, senza tentare di eseguire il ELF per scoprire le dipendenze (met/unmet) nel sistema. Forse chiedendo l'utilità ld-linux.so tramite qualche libreria? (Io sono un novizio in questa parte del linux =)

NOTA: la lettura del codice sorgente di ldd non era molto disponibile per le mie intenzioni: sembra che ldd è infatti sborsare un altro processo e l'esecuzione del programma.

Se non è possibile sapere che un programma ha dipendenze non soddisfatte senza eseguirlo, c'è qualche modo per, almeno, in modo rapido elencare il .so del necessario per che ELF tutto da dentro il mio programma?

Grazie in anticipo =)

+0

Hai una buona ragione perché non basta richiamare l'utilità ldd e analizzare il suo output? Sotto Linux, tale tecnica è ampiamente utilizzata. – Juraj

+0

Preferirei non chiamare la shell per eseguire nient'altro che il mio programma .. inoltre, non è molto efficace per fork, avviare una shell, ecc solo per provare se un eseguibile verrà eseguito per tentativi ed errori .. ma sì , Sospetto che invocare ldd sia una buona scelta standard. – conejoroy

+1

Siamo spiacenti, questo è un mito. Fork non è affatto costoso al giorno d'oggi e la maggior parte delle chiamate exec *() non usa shell per eseguire un binario. È facilmente possibile che ucciderai più tempo immergendoti negli interni di ld-linux rispetto al sovraccarico di fork()/exec() per tutte le future chiamate insieme. – Juraj

risposta

8

Come da ld.so(8), impostando la variabile d'ambiente LD_TRACE_LOADED_OBJECTS ad una stringa non vuota darà ldd -come risultati (invece di eseguendo normalmente il binario o la biblioteca).

setenv("LD_TRACE_LOADED_OBJECTS", "1", 1); 
FILE *ldd = popen("/lib/libz.so"); 
+0

sì, che darà esattamente lo stesso output di ldd (beh, con forse l'impostazione di un altro paio di envs in più) in effetti ldd non è altro che il tuo codice .. ma ovviamente questa soluzione è la stessa che chiama ldd che a sua volta chiamerà il tuo codice. Stavo cercando un'altra soluzione, magari interrogando ld-linux.so in un altro, più diretto .. – conejoroy

+0

.. e senza invocare una shell =) – conejoroy

+0

Senza invocare una shell è facile - solo 'fork' e' exec' ('pipe' prima se vuoi output, e' fdopen' se vuoi veramente un 'FILE * ') invece di' popen'. Si tratta fondamentalmente di interrogare 'ld-linux.so' senza dover scrivere hardcoded * che *' ld-linux.so'. – ephemient

1

Hai provato dlopen funzione? puoi usare questo per caricare una libreria dinamica (o, nel tuo caso, per controllare se una libreria può essere caricata).

Avere una lista di librerie necessarie è più difficile, date un'occhiata a handle_dynamic funzione readelf source

+0

questa funzione è interessante, posso vedere il rpath e altri parametri .. Esaminerò ulteriormente, grazie – conejoroy