71 votes

Comment vérifier quelles bibliothèques partagées sont chargées au moment de l'exécution pour un processus donné ?

Existe-t-il un moyen de vérifier les bibliothèques utilisées par un processus en cours d'exécution ?

Pour être plus spécifique, si un programme charge certaines bibliothèques partagées en utilisant dlopen alors readelf ou ldd ne vont pas le montrer. Est-il possible d'obtenir cette information à partir d'un processus en cours d'exécution ? Si oui, comment ?

99voto

Dietrich Epp Points 72865

D'autres personnes sont sur la bonne voie. Voici quelques pistes.

cat /proc/NNNN/maps | awk '{print $6}' | grep '\.so' | sort | uniq

Ou bien, avec de la 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. La première donne une sortie assez jolie, juste une liste de bibliothèques, une par ligne. La seconde continuera à lister les bibliothèques au fur et à mesure qu'elles sont ouvertes, ce qui est bien.

Et bien sûr lsof ...

lsof -p NNNN | awk '{print $9}' | grep '\.so'

18voto

Nim Points 22570

Peut être lsof - le couteau suisse de linux va aider ?

edit : pour courir, lsof -p <pid> L'outil de gestion de l'information et de la communication (GAC), qui liste toutes sortes d'informations utiles, par exemple, si le processus est java, il liste tous les pots ouverts - très cool...

15voto

abyss.7 Points 2540

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 site link_map contient au moins l'adresse de base et le nom absolu du fichier. C'est la structure qui est effectivement retournée par dlopen() avec un premier argument non NULL. Pour plus de détails, voir aquí .

12voto

ChAoS Points 470

ltrace semble être votre ami.

De ltrace manuel :

ltrace est un programme qui permet simplement de simplement exécuter la commande spécifiée jusqu'à ce qu'elle jusqu'à ce qu'elle se termine. Il intercepte et enregistre les appels de bibliothèque dynamique qui sont appelés par le processus exécuté et les signaux qui sont reçus par ce processus. Il peut également intercepter et imprimer les appels système exe- par le programme.

       Its use is very similar to strace(1).

7voto

Kieron Points 5096

Sous Linux, /proc/<processid>/maps contient une liste de tous les fichiers mappés en mémoire, qui, je pense, devrait inclure ceux chargés par dlopen() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X