2012-08-24 16 views
36

¿Hay alguna manera de ver qué compilador y banderas se usaron para crear un archivo ejecutable en * nix? Tengo compilada una versión anterior de mi código y me gustaría ver si fue compilada con o sin optimización. Google no fue de mucha ayuda, pero no estoy seguro de estar usando las palabras clave correctas.Obtener las opciones del compilador de un ejecutable compilado?

+1

Parece que 'frecord-gcc-switches' es el truco para gcc, pero ¿hay una bandera similar para Intel (icc)? – Mosby

+0

¿hay alguna forma de hacerlo sin frecord-gcc-switches? p.ej. mira el nivel de despliegue del lazo y así sucesivamente – OneSolitaryNoob

Respuesta

48

gcc tiene una opción para que -frecord-gcc-switches:

-frecord-gcc-switches 
     This switch causes the command line that was used to invoke the compiler to 
     be recorded into the object file that is being created. This switch is only 
     implemented on some targets and the exact format of the recording is target 
     and binary file format dependent, but it usually takes the form of a section 
     containing ASCII text. 

Posteriormente, los ejecutables ELF contendrán .GCC.command.line sección con esa información.

$ gcc -O2 -frecord-gcc-switches a.c 
$ readelf -p .GCC.command.line a.out 

String dump of section '.GCC.command.line': 
    [  0] a.c 
    [  4] -mtune=generic 
    [ 13] -march=x86-64 
    [ 21] -O2 
    [ 25] -frecord-gcc-switches 

Por supuesto, no funcionará para los ejecutables compilados sin esa opción.


Para el caso simple de optimizaciones, podría intentar usar un depurador si el archivo se ha compilado con información de depuración. Si lo hace un poco, puede observar que algunas variables fueron 'optimizadas'. Eso sugiere que la optimización tuvo lugar.

+0

+1 por readelf. – Johan

+0

'-frecord-gcc-switches' es casi lo que necesito. Sin embargo, la sección resultante tiene '-fpreprocessed', y todas las definiciones de macro' -D' ya no están allí. ¿Cómo puedo obtenerlos? (Estoy construyendo un módulo kernel). –

3

Esto es algo que requeriría el soporte del compilador. No mencionas qué compilador estás utilizando, pero desde que etiquetaste tu pregunta linux asumiré que estás utilizando gcc, que no predetermina la función que estás preguntando (pero -frecord-gcc-switches es una opción para realizar esta).

Si desea inspeccionar su binario, el comando strings le mostrará todo lo que parece ser una cadena de caracteres legible dentro del archivo.

1

altamente duda es posible:

int main() 
{ 
} 

cuando se compila con:

gcc -O3 -ffast-math -g main.c -o main 

Ninguno de los parámetros se puede encontrar en el objeto generado:

strings main | grep -O3 
(no output) 
+0

Aunque ...Estaba haciendo una comparación entre el ejecutable generado para un programa similar de "no hacer nada" con y sin optimizaciones, y muestran algunas diferencias alrededor de ... –

+0

Ok, verificando con 'readelf' muestra que es solo una disposición diferente del funciones, nada explícitamente gritando "esto fue compilado con' -O3' ". –

11

Si compilar con la bandera -frecord-gcc-switches, entonces las opciones del compilador de línea de comandos se escribirán en el binario en th e nota de la sección. See also the docs.

+0

¿Cuál es la mejor manera de verificar el binario? Hexeditor? binutils? – Johan

+2

@Johan: 'readelf'. –

+0

cadenas no me funcionaron, readelf sí funcionó. – Johan

1

Si aún tiene el compilador (la misma versión) que usó, y es solo un indicador del que no está seguro, puede intentar compilar su código nuevamente, una vez con y sin la bandera. Entonces puedes comparar los ejecutables. Su anterior debería ser idéntico, o muy similar, a uno de los nuevos.

5

Otra opción es -grecord-gcc-swtiches (nota, no -f pero -g). De acuerdo con los documentos de gcc, pondrá banderas en información de depuración enana. Y parece que está habilitado por defecto, ya que gcc 4.8.

He encontrado que el programa dwarfdump es útil para extraer esos cflags. Tenga en cuenta que el programa de cadenas no los ve. Parece que la información enana está comprimida.

Cuestiones relacionadas