En fait, vous pouvez le faire dans votre code de la manière suivante :
#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;
}
Le link_map
structure contient au moins l'adresse de base et le nom de fichier absolu. C'est la structure qui est réellement retournée par dlopen()
avec un premier argument non NULL. Pour plus de détails, voir ici.
D'autres personnes sont sur la bonne voie. Voici quelques façons.
cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq
Ou, avec strace :
strace CMD.... 2>&1 | grep -E '^open(at)?\(.*\.so'
Les deux supposent que les bibliothèques partagées ont ".so" quelque part dans leurs chemins, mais vous pouvez modifier cela. Le premier donne une sortie assez jolie sous la forme d'une simple liste de bibliothèques, une par ligne. Le second continuera à répertorier les bibliothèques au fur et à mesure de leur ouverture, donc c'est bien.
Et bien sûr lsof
...
lsof -p NNNN | awk '{print $9}' | grep '\.so'
Peut être lsof
- le couteau suisse de linux vous aidera ?
edit :pour exécuter, lsof -p <pid>
, répertorie toutes sortes d'informations utiles, par exemple, si le processus est java, répertorie tous les jars ouverts - très cool...