web-dev-qa-db-fra.com

Comment savoir si une bibliothèque a été compilée avec -g?

J'ai quelques bibliothèques compilées sur Linux x86 et je veux déterminer rapidement si elles ont été compilées avec des symboles de débogage.

91
Dan Hook

Si vous utilisez Linux, utilisez objdump --debugging. Il devrait y avoir une entrée pour chaque fichier objet dans la bibliothèque. Pour les fichiers objets sans symboles de débogage, vous verrez quelque chose comme:

objdump --debugging libvoidincr.a
In archive libvoidincr.a:

voidincr.o:     file format elf64-x86-64

S'il y a des symboles de débogage, la sortie sera beaucoup plus détaillée.

74
Matt McClellan

La commande suggérée

objdump --debugging libinspected.a
objdump --debugging libinspected.so

me donne toujours le même résultat au moins sur Ubuntu/Linaro 4.5.2:

libinspected.a:     file format elf64-x86-64
libinspected.so:     file format elf64-x86-64

que l'archive/la bibliothèque partagée ait été construite avec ou sans -g option

Ce qui m'a vraiment aidé à déterminer si -g a été utilisé est readelf outil:

readelf --debug-dump=decodedline libinspected.so

ou

readelf --debug-dump=line libinspected.so

Cela imprimera un ensemble de lignes composé du nom du fichier source, du numéro de ligne et de l'adresse si ces informations de débogage sont incluses dans la bibliothèque , sinon elles seront imprimées rien .

Vous pouvez transmettre la valeur que vous jugerez nécessaire pour --debug-dump option au lieu de decodedline.

81
Alex InTechno

nm -a <lib> imprimera tous les symboles de la bibliothèque, y compris ceux de débogage.

Vous pouvez donc comparer les sorties de nm <lib> et nm -a <lib> - s'ils diffèrent, votre lib contient des symboles de débogage.

25
qrdl

Ce qui a aidé, c'est:

gdb mylib.so

Il s'imprime lorsque les symboles de débogage ne sont pas trouvés:

Reading symbols from mylib.so...(no debugging symbols found)...done.

Ou une fois trouvé:

Reading symbols from mylib.so...done.

Aucune des réponses précédentes ne donnait de résultats significatifs pour moi: les bibliothèques sans symboles de débogage donnaient beaucoup de sortie, etc.

24
Velkan

Sous OSX, vous pouvez utiliser dsymutil -s et dwarfdump.

En utilisant dsymutil -s <lib_file> | more vous verrez les chemins d'accès aux fichiers source dans les fichiers qui ont des symboles de débogage, mais uniquement les noms des fonctions sinon.

14
glennr

Vous pouvez utiliser objdump pour cela.

EDIT: À partir de la page de manuel:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.
11
swegi

Réponses suggérant l'utilisation de objdump --debugging ou readelf --debug-dump=... ne fonctionne pas dans le cas où les informations de débogage sont stockées dans un fichier séparé du binaire, c'est-à-dire que le binaire contient une section lien de débogage . On pourrait peut-être appeler cela un bogue dans readelf.

Le code suivant doit gérer cela correctement:

# Test whether debug information is available for a given binary
has_debug_info() {
  readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}

Voir Fichiers de débogage séparés dans le manuel GDB pour plus d'informations.

4
ack