2011-10-25 15 views
5

Vorrei ottenere a livello di programmazione un elenco delle librerie condivise collegate dal mio binario su Linux e Solaris. In questo momento mi sborsare per pmap (non posso usare ldd sul binario perché non includerà librerie dlopen'd, e non posso usare pldd perché è solo Solaris):Come ottenere l'elenco delle librerie condivise eseguibili da C++?

std::ostringstream cmd; 
cmd << "/usr/bin/pmap " << getpid() << " | awk '{ print $NF }' | grep '\\.so' | sort -u"; 
FILE* p = popen(cmd.str().c_str(), "r"); 

Questo è un po 'hacker ma funziona sia su Solaris che su Linux (l'output pmap è leggermente diverso ma le informazioni desiderate sono sempre nell'ultima colonna). C'è un modo per ottenere le stesse informazioni senza sborsare? Funziona su entrambe le piattaforme? Presumo che i file /proc/$PID siano formattati in modo diverso tra di loro, ma non so dove si trovano le intestazioni per aiutare ad analizzare quelli che di solito si trovano (se c'è una posizione comune?).

+0

Strettamente parlando, le librerie 'dlopen'ed non sono" collegate ", sono caricate in fase di runtime. Presumo che tu voglia veramente una lista di tutte le librerie condivise caricate? –

+0

Questo è corretto. –

risposta

2

È possibile utilizzare il comando pmap 1234 con 1234 come ID di processo.

Dall'interno del programma, il modo più semplice (specifico per Linux) è leggere e analizzare il file /proc/self/maps.

provare a eseguire

cat /proc/self/maps

sotto Linux: che vi mostrerà la mappatura della memoria del processo in esecuzione il comando cat sopra.

E se si dispone di un puntatore preciso, è possibile utilizzare dladdr (una funzione specifica GNU/Linux o Glibc) per ottenere informazioni su quale libreria dinamica lo contiene.

Problemi correlati