Sebenarnya, Anda dapat melakukannya di kode Anda dengan cara berikut:
#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;
}
link_map
struktur berisi setidaknya alamat dasar dan nama file absolut. Ini adalah struktur yang sebenarnya dikembalikan oleh dlopen()
dengan argumen pertama non-NULL. Untuk detail selengkapnya, lihat di sini.
Orang lain berada di jalur yang benar. Berikut adalah beberapa cara.
cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq
Atau, dengan strace:
strace CMD.... 2>&1 | grep -E '^open(at)?\(.*\.so'
Keduanya mengasumsikan bahwa pustaka bersama memiliki ".so" di suatu tempat di jalurnya, tetapi Anda dapat mengubahnya. Yang pertama memberikan hasil yang cukup cantik hanya sebagai daftar pustaka, satu per baris. Yang kedua akan terus mencantumkan perpustakaan saat dibuka, jadi itu bagus.
Dan tentu saja lsof
...
lsof -p NNNN | awk '{print $9}' | grep '\.so'
Mungkin lsof
- pisau swiss army dari linux akan membantu?
edit:untuk menjalankan, lsof -p <pid>
, mencantumkan semua jenis informasi yang berguna, misalnya, jika prosesnya adalah java, daftarkan semua stoples yang terbuka - sangat keren...