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

J’ai des 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.

Si vous utilisez Linux, utilisez objdump --debugging . Il devrait y avoir une entrée pour chaque fichier object dans la bibliothèque. Pour les fichiers objects 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 existe des symboles de débogage, la sortie sera beaucoup plus détaillée.

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 l’option -g

Ce qui m’a vraiment aidé à déterminer si -g été utilisé est un outil de lecture :

 readelf --debug-dump=decodedline libinspected.so 

ou

 readelf --debug-dump=line libinspected.so 

Cela imprimera un ensemble de lignes composé du nom de 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 n’imprimeront rien .

Vous pouvez passer n’importe quelle valeur que vous trouverez nécessaire pour l’option --debug-dump au lieu de decodedline .

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

Vous pouvez donc comparer les sorties de nm et nm -a – si elles diffèrent, votre lib contient des symboles de débogage.

Ce qui a aidé est:

 gdb mylib.so 

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

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

Ou quand 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 résultats, etc.

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

Vous pouvez utiliser objdump pour cela.

EDIT: De la page de manuel:

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

Les réponses suggérant l’utilisation d’ objdump --debugging ou readelf --debug-dump=... ne fonctionnent pas dans le cas où les informations de débogage sont stockées dans un fichier distinct du binary, c’est-à-dire que le binary contient une section de lien de débogage . On pourrait peut-être appeler cela un bug en readelf .

Le code suivant devrait 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 Séparer les fichiers de débogage dans le manuel GDB pour plus d’informations.