2012-02-16 16 views
5

Aquí tengo un archivo ejecutable sin conocer su entorno de compilación, suponiendo que se está utilizando gcc/g ++. ¿Hay alguna manera de averiguar el indicador de optimización utilizado durante la compilación (como O0, O2, ...)?Averiguar el indicador de optimización de compilación desde el ejecutable

Todos los medios son bienvenidos, no importa si se analiza el binario o alguna prueba de depuración a través de gdb (si suponemos que el indicador -g está disponible durante la compilación).

+0

Esta pregunta podría ayudar: http://stackoverflow.com/questions/189350/detect-gcc-compile-time-flags-of-a-binary – Nick

+3

Estaría muy interesado en el motivo de tal solicitud. En particular, debe saber que las optimizaciones se pueden activar y desactivar de forma individual, y los niveles 'O' son solo grupos por conveniencia. –

+1

En particular, vea [esta respuesta informativa] (http://stackoverflow.com/a/340828/15416) a esa pregunta. Esa es una prueba concluyente de que no puede hacerlo de manera confiable. – MSalters

Respuesta

-4

Probablemente no quiera hacer eso.

Piénselo ... ¿Desea utilizar un código que cambie el comportamiento según las opciones de optimización utilizadas para compilarlo?

Si no, ¿por qué quieres escribirlo?

+3

No contesta la Q, en el mejor de los casos un comentario. –

+0

Creo que quiere decir que tiene un ejecutable que quiere investigar. – MByD

+1

No, no responde la pregunta. Pero piénselo: las optimizaciones nunca deberían cambiar el comportamiento del programa, ¿verdad? Parece que quiere hacer precisamente eso ... – jakob

2

Si tiene suerte, la línea de comandos está presente en el archivo ejecutable, dependiendo del sistema operativo y el formato de archivo utilizado. Si es un archivo Elf, intente volcar el contenido usando objdump desde GNU binutils

0

Realmente no sé si esto puede ayudar, pero verificar O0 es bastante fácil en el desensamblaje (objdump -d), ya que el código generado no tiene optimización en absoluto y agrega algunas instrucciones para simplificar la depuración.

Normalmente en un x86, el prólogo de una función incluye guardar el puntero de la pila (para la traza inversa, supongo). Así que si a localizar, por ejemplo, la función principal, que debería ver algo como:

... principal: ... empujar% RBP ... mov% RSP, RBP%

Y usted debería ver este "patrón" en casi todos los comienzos de las funciones. Para otros objetivos (no sé cuál es su plataforma de destino), debería ver secuencias de ensamblaje más o menos similares en los prólogos o antes de que la función llame.

Para otros niveles de optimización, las cosas son mucho más complicadas.

Perdón por permanecer vago y no responder a la pregunta completa ... Solo espero que ayude.

Cuestiones relacionadas