linux / gcc: funzionalità ldd dall'interno di un programma C / C ++
-
19-09-2019 - |
Domanda
C'è un modo semplice ed efficace per sapere che un dato ELF
collegato dinamicamente manca un necessario .so per l'esecuzione, tutti dalla all'interno di un programma C / C ++?
Ho bisogno di un programma con funzionalità in qualche modo simile come ldd
, senza cercare di eseguire il ELF
per scoprire le (TEM / insoddisfatta) dipendenze 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 del
ldd
non era molto disponibile per le mie intenzioni:. Sembra cheldd
è in realtà fork 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 =)
Soluzione
Come per ld.so (8) , impostando la variabile ambientale LD_TRACE_LOADED_OBJECTS
ad una stringa non vuota fornirà risultati ldd
-simile (anziché eseguire il binario o libreria normalmente).
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");
Altri suggerimenti
Hai provato la funzione dlopen
? è possibile utilizzare questo per caricare una libreria dinamica (o, per il vostro caso, a ckeck se una libreria può essere caricato).
Avere una lista di librerie necessarie è più difficile, date un'occhiata a handle_dynamic
funzione fonte readelf
Cosa succede ad usare ptrace () per tracciare tutti aperti () chiama per trovare tutti quello che il programma dipende da (tuttavia, l'output include i file, non solo biblioteche) .o forse filtrare l'uscita dal prefisso nel nome del file "/ lib" aiuta.