web-dev-qa-db-fra.com

Obtenir la liste des bibliothèques statiques utilisées dans un exécutable

Puisque ldd répertorie uniquement les bibliothèques dynamiques, existe-t-il un moyen d'extraire les informations sur les bibliothèques statiques utilisées pour créer l'exécutable?

42
Saurabh

Non, les noms des bibliothèques sont supprimés pendant le processus de liaison. Cependant, si votre exécutable contient des informations de débogage (c'est-à-dire qu'il a été compilé avec l'indicateur -g), vous pourrez peut-être en obtenir des informations.

11
anon

Si vous avez le code source et que vous ne voulez pas parcourir tout le code pour cela, vous pouvez générer un fichier de carte lors de la compilation pour savoir quelles bibliothèques statiques sont liées.

Par exemple g++ -Xlinker -Map=a.map main.c, consultez le fichier de carte pour obtenir des informations sur la bibliothèque statique liée.

8
zhangxin

Il n'y a aucun moyen d'obtenir la liste des bibliothèques statiques dans certains exécutables ELF .

Parce que pour l'éditeur de liens, une bibliothèque statique est simplement utilisée comme un ensemble de membres "paresseux". Ainsi, l'exécutable ELF résultant ne contiendrait que les membres nécessaires pour le lier. Les membres aiment donc foo2.o de libfoo.a sont liés comme si le fichier d'objet foo2.o était lié à l'exécutable (à condition qu'un symbole soit défini dans foo2 est nécessaire, c'est-à-dire référencé quelque part).

Bien sûr, l'utilisation de nm, ou objdump, ou readelf, ou strings sur certains exécutables ELF peut donner des indications sur les fichiers objets (y compris ceux qui viennent des bibliothèques statiques ) se trouvent à l'intérieur, car vous verrez des symboles définis dans (les membres de) ces bibliothèques statiques (ou des chaînes littérales utilisées à l'intérieur).

5

Sauf si un compilateur donné stocke une sorte de métadonnées dans le binaire, non. Une bibliothèque statique est un code qui est directement compilé dans le binaire.

5
Goz