In realtà, puoi farlo nel tuo codice nel modo seguente:
#include <link.h>
using UnknownStruct = struct unknown_struct {
void* pointers[3];
struct unknown_struct* ptr;
};
using LinkMap = struct link_map;
auto* handle = dlopen(NULL, RTLD_NOW);
auto* p = reinterpret_cast<UnknownStruct*>(handle)->ptr;
auto* map = reinterpret_cast<LinkMap*>(p->ptr);
while (map) {
std::cout << map->l_name << std::endl;
// do something with |map| like with handle, returned by |dlopen()|.
map = map->l_next;
}
Il link_map
La struttura contiene almeno l'indirizzo di base e il nome file assoluto. È la struttura effettivamente restituita da dlopen()
con primo argomento diverso da NULL. Per maggiori dettagli vedi qui.
Altre persone sono sulla strada giusta. Ecco un paio di modi.
cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq
Oppure, con strace:
strace CMD.... 2>&1 | grep -E '^open(at)?\(.*\.so'
Entrambi presumono che le librerie condivise abbiano ".so" da qualche parte nei loro percorsi, ma puoi modificarlo. Il primo fornisce un output abbastanza carino come un semplice elenco di librerie, una per riga. Il secondo continuerà a elencare le librerie man mano che vengono aperte, quindi è carino.
E ovviamente lsof
...
lsof -p NNNN | awk '{print $9}' | grep '\.so'
Potrebbe essere lsof
- il coltellino svizzero di Linux aiuterà?
modifica:per eseguire, lsof -p <pid>
, elenca tutti i tipi di informazioni utili, ad esempio, se il processo è java, elenca tutti i barattoli aperti - molto interessante...