¿Detecta si un binario ELF fue construido con instrumentación gprof?

11

¿Es posible verificar si el programa dado fue compilado con la instrumentación GNU gprof, es decir, con el indicador '-pg' pasado tanto al compilador como al enlazador, sin ejecutarlo para verificar si generaría un gmon.outarchivo?

Jakub Narębski
fuente

Respuestas:

10

Puede verificar las referencias a la función mcount(o posiblemente _mcounto de __mcountacuerdo con la Implementación de perfiles ). Esta función es necesaria para que los perfiles funcionen, y debe estar ausente para los binarios sin perfil.

Algo como:

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

Lo anterior funciona en una prueba rápida aquí.

Estera
fuente
2

La expresión regular en la respuesta anterior no siempre funciona ... pero la idea general de grepping para "mcount" en la salida de 'readelf -s [binary]' es correcta, creo

Ben
fuente
0

Agregando más a las respuestas:

  1. Para verificar la instrumentación, grep para 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. Es necesario compilar y vincular con -pgbanderas, de lo contrario gmon.outno se generará. enlace stackoverflow.

  3. Descubrí que el binario en el que ejecutaba gprof no generaba ningún gmon.outarchivo, a pesar de compilar / vincular con -pgflag. La razón es que estaba matando mi aplicación, no era una salida limpia. gprofgenera salida solo cuando el programa sale normalmente. enlace stackoverflow

pie roto
fuente