web-dev-qa-db-fra.com

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?

Pour être plus précis, si un programme charge des bibliothèques partagées en utilisant dlopen , alors readelf ou ldd ne va pas le montrer. Est-il possible d'obtenir ces informations à partir d'un processus en cours? Si oui, comment?

47
BЈовић

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 '^open(".*\.so"'

Ces deux supposent que les bibliothèques partagées ont ".so" quelque part sur leur chemin, mais vous pouvez le modifier. Le premier donne une sortie assez jolie comme juste une liste de bibliothèques, une par ligne. Le second continuera à lister les bibliothèques au fur et à mesure de leur ouverture, c'est donc bien.

Edit: Et bien sûr lsof...

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

Peut-être lsof - le couteau suisse de Linux vous aidera?

modifier: pour exécuter, lsof -p <pid>, répertorie toutes sortes d'informations utiles, par exemple, si le processus est Java, répertorie tous les pots ouverts - très cool ...

15
Nim

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;
}

La structure link_map 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 le premier argument non NULL. Pour plus de détails, voir ici .

11
abyss.7

ltrace semble être votre ami.

Depuis le manuel ltrace:

ltrace est un programme qui exécute simplement la commande spécifiée jusqu'à sa fermeture. 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 exécutés par le programme.

       Its use is very similar to strace(1).
7
chaos.ct

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

6
Kieron

Sur Solaris, il y a aussi la commande pldd.

3
Christian.K

Est-ce que strace tracerait le fichier de bibliothèque en cours d'ouverture?

1
Martin Broadhurst