Détecter si un binaire ELF a été construit avec l'instrumentation gprof?

11

Est-il possible de vérifier si un programme donné a été compilé avec l'instrumentation GNU gprof, c'est-à-dire avec le drapeau '-pg' passé à la fois au compilateur et à l'éditeur de liens, sans l' exécuter pour vérifier s'il générerait un gmon.outfichier?

Jakub Narębski
la source

Réponses:

10

Vous pouvez vérifier les références à la fonction mcount(ou éventuellement _mcountou __mcountselon l' implémentation du profilage ). Cette fonction est nécessaire pour que le profilage fonctionne et doit être absente pour les fichiers binaires non profilés.

Quelque chose comme:

$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"

Ce qui précède fonctionne sur un test rapide ici.

Tapis
la source
2

L'expression régulière dans la réponse ci-dessus ne fonctionne pas toujours ... mais l'idée générale d'accueillir "mcount" dans la sortie de "readelf -s [binary]" est correcte, je pense

Ben
la source
0

Ajout de plus aux réponses:

  1. Pour vérifier l'instrumentation, grep pour mcount / gmon:

    $  readelf -s <binary> | egrep "gmon|mcount"    
    20: 0000000000401160    63 FUNC    GLOBAL DEFAULT   12 __gmon_start__    
    28: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mcount@GLIBC_2.2.5 (2)    
    36: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS gmon-start.c    
    39: 00000000004011a0     0 FUNC    LOCAL  DEFAULT   12 call_gmon_start    
    100: 0000000000401160    63 FUNC    GLOBAL DEFAULT   12 __gmon_start__    
    114: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND mcount@@GLIBC_2.2.5    
    
  2. Il faut compiler et lier avec des -pgdrapeaux, sinon gmon.outil ne sera pas généré. lien stackoverflow.

  3. J'ai trouvé que le binaire sur lequel j'exécutais gprof ne générait aucun gmon.outfichier, malgré la compilation / liaison avec -pgflag. La raison étant - je tuais ma candidature, ce n'était pas une sortie propre. gprofgénère une sortie uniquement lorsque le programme se termine normalement. lien stackoverflow

pied cassé
la source