¿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?
Respuesta
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.
+1 por readelf. – Johan
'-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). –
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.
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)
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 ... –
Ok, verificando con 'readelf' muestra que es solo una disposición diferente del funciones, nada explícitamente gritando "esto fue compilado con' -O3' ". –
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.
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.
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.
- 1. Rendimiento del código compilado por el compilador compilado
- 2. Incrustar archivos DLL en un ejecutable compilado
- 3. incluyendo encabezados externos descubriendo las opciones del compilador
- 4. Distribución de un ejecutable compilado con un paquete R
- 5. gcc 4.3.3 opciones del compilador habilitadas de forma predeterminada
- 6. Obtener la versión del archivo ejecutable no ejecutable
- 7. opciones booleanas de las opciones del programa boost
- 8. ¿Cómo obtener las opciones de un atributo configurable en Magento?
- 9. Concepto de "eliminación de código muerto" en las opciones de optimización del compilador
- 10. ¿Cómo puedo configurar las opciones en SConstruct para el compilador de C dependiendo del tipo de compilador?
- 11. Obtener el encabezado ELF del ejecutable principal
- 12. Opciones del compilador Java para producir archivos .exe
- 13. ¿Cómo obtener la lista de opciones con las que se compiló Python?
- 14. Casos de prueba del compilador o cómo probar un compilador
- 15. autotools: habilitar las advertencias del compilador
- 16. ¿Cómo un compilador JIT ayuda al rendimiento de las aplicaciones?
- 17. ¿Qué me falta en las opciones del compilador para vincular con la biblioteca estática JSON-C?
- 18. Obtener el nombre del archivo ejecutable desde el método main()
- 19. ¿Cómo agrego un ícono a un ejecutable compilado de mingw-gcc?
- 20. ¿Cómo afectan los símbolos de depuración el rendimiento de un ejecutable Linux compilado por GCC?
- 21. ¿Cómo determinar qué compilador se ha utilizado para compilar un ejecutable?
- 22. Obtener Ada (compilado con GNAT) para importar archivos desde fuera del directorio actual?
- 23. Cómo cargar un archivo ejecutable ELF ejecutable dinámicamente?
- 24. Deshabilitar las advertencias del compilador por línea
- 25. Suprimir globalmente las advertencias del compilador C#
- 26. ¿Cuál es la diferencia entre las opciones de manejo de la biblioteca jar ejecutable?
- 27. Cómo obtener el nombre del ejecutable de una ventana
- 28. Programación genética en C++: invocación de un enlazador/compilador, ejecución del programa compilado y entrada/salida de tubería
- 29. C opciones de Visual C++ de compilador por defecto
- 30. ¿Cómo obtener el código fuente de un ejecutable de Windows?
Parece que 'frecord-gcc-switches' es el truco para gcc, pero ¿hay una bandera similar para Intel (icc)? – Mosby
¿hay alguna forma de hacerlo sin frecord-gcc-switches? p.ej. mira el nivel de despliegue del lazo y así sucesivamente – OneSolitaryNoob