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

103

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

Dan Hook
la source

Réponses:

85

Si vous utilisez Linux, utilisez objdump --debugging. Il doit 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.

Matt McClellan
la source
5
Il y a aussi obdjump -W libet readelf -w lib. Ce dernier est plus configurable - voir la page de manuel readelf (1).
przemoc
3
Pour tout binaire, (y compris ceux compilés avec -g) objdump me donne la réponse "aucune information de débogage reconnue" à moins que je ne le compile avec -gstabs. Cela semble être un bogue reconnu.
Dan Hook
Dan, sur quelle plateforme avez-vous essayé ça?
swegi
Employé russe: à partir de man objdump (1), l'indicateur --debugging "tente d'analyser les informations de format de débogage STABS et IEEE stockées dans le fichier et de les imprimer en utilisant une syntaxe de type C. Si aucun de ces formats n'est trouvé, cette option est rétablie sur l'option -W pour imprimer les informations DWARF dans le fichier. "
Matt McClellan
5
objdump -gne me donne rien pour un simple test.o compilé avec et sans g, ce qui le rend effectivement inutile. Ubuntu 12.04, gcc 4.6.3, objdump GNU 2.22. nm -asemble être plus utile.
jw013
89

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

peu importe si l'archive / la bibliothèque partagée a été construite avec ou sans -goption

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

readelf --debug-dump=decodedline libinspected.so

ou

readelf --debug-dump=line libinspected.so

Cela imprimera un ensemble de lignes comprenant le nom du fichier source, le numéro de ligne et l'adresse si de telles informations de débogage sont incluses dans la bibliothèque , sinon cela n'imprimera rien .

Vous pouvez passer la valeur que vous jugerez nécessaire pour l' --debug-dumpoption au lieu de decodedline.

Alex InTechno
la source
1
fonctionne parfaitement. J'ai essayé cette commande sur mon exécutable avec le premier CMAKE_BUILD_TYPE RELEASE et la commande est retournée vide. Ensuite, j'ai essayé avec CMAKE_BUILD_TYPE DEBUG et puis il y avait beaucoup de sortie.
enregistré
32

Ce qui a aidé 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 résultats, etc.

Velkan
la source
THX! Cela a fonctionné pour moi, en utilisant le compilateur clang sous Android avec cmake :)
Pär Nils Amsen
super super pour une vérification rapide! fonctionne également sur les fichiers objets * .o.
Stephane Rolland le
28

nm -a <lib> affichera 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>- si elles diffèrent, votre bibliothèque contient des symboles de débogage.

qrdl
la source
3
@Employed Russian Pouvez-vous nous en dire plus? Pourquoi pensez-vous que c'est un mauvais outil? Il fait le travail, et le fait également sous Linux.
qrdl
Même pour Linux embarqué basé sur le noyau 2.6.35, xxx-objdump, xxx-nm fonctionne bien.
agfe2
nm -aa un alias nm --debug-symsqui est explicite :-).
pevik
3
Tapez simplement diff <(nm <lib>) <(nm -a <lib>)pour obtenir une différence facile
Aᴄʜᴇʀᴏɴғᴀɪʟ
17

Sur OSX, vous pouvez utiliser dsymutil -set dwarfdump.

En utilisant, dsymutil -s <lib_file> | morevous verrez les chemins des fichiers source dans les fichiers qui ont des symboles de débogage, mais uniquement les noms de fonction sinon.

Glennr
la source
11
Pouvez-vous fournir une explication sur ce qu'il faut rechercher dans la sortie, par exemple dsymutil -s? L'existence de la sortie signifie-t-elle qu'elle a été construite avec des symboles de débogage, ou doit-elle être greffée?
Mitch
12

Vous pouvez utiliser objdump pour cela.

EDIT: Depuis la page de manuel:

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

Réponses suggérant l'utilisation objdump --debuggingou readelf --debug-dump=...ne fonctionnant 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 de lien de débogage . On pourrait peut-être appeler cela un bug 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.

accuser
la source