Tatsächlich können Sie dies in Ihrem Code folgendermaßen tun:
#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;
}
Der link_map
enthält mindestens die Basisadresse und den absoluten Dateinamen. Es ist die Struktur, die tatsächlich von dlopen()
zurückgegeben wird mit erstem Argument ungleich NULL. Weitere Einzelheiten finden Sie hier.
Andere Leute sind auf dem richtigen Weg. Hier sind ein paar Möglichkeiten.
cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq
Oder mit strace:
strace CMD.... 2>&1 | grep -E '^open(at)?\(.*\.so'
Beide gehen davon aus, dass gemeinsam genutzte Bibliotheken irgendwo in ihren Pfaden ".so" haben, aber Sie können das ändern. Die erste gibt eine ziemlich hübsche Ausgabe als eine Liste von Bibliotheken, eine pro Zeile. Der zweite listet weiterhin Bibliotheken auf, während sie geöffnet werden, das ist also schön.
Und natürlich lsof
...
lsof -p NNNN | awk '{print $9}' | grep '\.so'
Kann lsof
sein - hilft das schweizer taschenmesser von linux?
Bearbeiten:zum Ausführen, lsof -p <pid>
, listet alle möglichen nützlichen Informationen auf, zum Beispiel, ob der Prozess Java ist, listet alle offenen Jars auf - sehr cool ...