¿Cómo recuperar la versión GCC utilizada para comstackr un ejecutable ELF determinado?

Me gustaría recuperar la versión de GCC utilizada para comstackr un ejecutable dado. Intenté readelf pero no readelf la información. ¿Alguna idea?

Normalmente se almacena en la sección de comentarios

 strings -a  |grep "GCC: (" 

devuelve GCC: (GNU) XXX

 strip -R .comment  strings -a  |grep "GCC: (" 

no devuelve ninguna salida

No es raro quitar la sección .comment (así como .note) para reducir el tamaño a través de

 strip --strip-all -R .note -R .comment  strip --strip-unneeded -R .note -R .comment  

Nota: busybox strings especifica la opción -a por defecto, que es necesaria para la sección .comment

Editar: Al contrario de la respuesta de Berendra Tusla, no necesita comstackrse con ningún indicador de depuración para que este método funcione.

Ejemplo binario:

 # echo "int main(void){}">ac # gcc -oa ac -s # strings -aa |grep GCC GCC: (GNU) 4.3.4 # strip -R .comment a # strings -aa |grep GCC # 

Ejemplo de objeto:

 # gcc -c ac -s # strings -a ao |grep GCC GCC: (GNU) 4.3.4 # strip -R .comment ao # strings -aa |grep GCC # 

Tenga en cuenta la ausencia de indicadores -g (depuración) y la presencia del distintivo -s que elimina los símbolos innecesarios. La información de GCC aún está disponible a menos que se elimine la sección de comas. Si necesita mantener esta información intacta, puede que necesite verificar su archivo MAKE (o el script de comstackción aplicable) para verificar que -fno-ident no está en sus $ CFLAGS y el comando $ STRIP carece de -R .comment. -fno-ident evita que gcc genere estos símbolos en la sección de comentarios para comenzar.

Para completar lo que otros han dicho: no está almacenado en el archivo de objeto (o exe), a menos que compile con información de depuración . (opción -g ). Si comstack con información de depuración, puede recuperarla con readelf :

 $ cat ac int main(void){ return 0; } $ gcc ac $ readelf -wi a.out $ gcc ac -g $ readelf -wi a.out Contents of the .debug_info section: Comstacktion Unit @ offset 0x0: Length: 0x42 (32-bit) Version: 2 Abbrev Offset: 0 Pointer Size: 4 <0>: Abbrev Number: 1 (DW_TAG_compile_unit) < c> DW_AT_producer : (indirect string, offset: 0x0): GNU C 4.4.3 20100108 (prerelease) <10> DW_AT_language : 1 (ANSI C) <11> DW_AT_name : ac <15> DW_AT_comp_dir : (indirect string, offset: 0x22): /tmp <19> DW_AT_low_pc : 0x8048394 <1d> DW_AT_high_pc : 0x804839e <21> DW_AT_stmt_list : 0x0 <1><25>: Abbrev Number: 2 (DW_TAG_subprogram) <26> DW_AT_external : 1 <27> DW_AT_name : (indirect string, offset: 0x27): main <2b> DW_AT_decl_file : 1 <2c> DW_AT_decl_line : 1 <2d> DW_AT_prototyped : 1 <2e> DW_AT_type : <0x3e> <32> DW_AT_low_pc : 0x8048394 <36> DW_AT_high_pc : 0x804839e <3a> DW_AT_frame_base : 0x0 (location list) <1><3e>: Abbrev Number: 3 (DW_TAG_base_type) <3f> DW_AT_byte_size : 4 <40> DW_AT_encoding : 5 (signed) <41> DW_AT_name : int 

Vea cómo dice GNU C 4.4.3 20100108 (prerelease) .

Hay otras dos formas (quizás un poco más simples) de las que acabo de leer aquí: https://unix.stackexchange.com/questions/719/can-we-get-compiler-information-from-an-elf-binary

 $ readelf -p .comment /usr/lib64/flash-plugin/libflashplayer.so String dump of section '.comment': [ 1] GCC: (GNU) 4.3.2 20081105 (Red Hat 4.3.2-7) [ 2e] GCC: (GNU) 4.3.2 ... 

y

 $ objdump -s --section .comment /usr/lib64/flash-plugin/libflashplayer.so /usr/lib64/flash-plugin/libflashplayer.so: file format elf64-x86-64 Contents of section .comment: 0000 00474343 3a202847 4e552920 342e332e .GCC: (GNU) 4.3. 0010 32203230 30383131 30352028 52656420 2 20081105 (Red 0020 48617420 342e332e 322d3729 00004743 Hat 4.3.2-7)..GC 0030 433a2028 474e5529 20342e33 2e320000 C: (GNU) 4.3.2.. ... 

Esta información no se almacena en el objeto comstackdo (c).

En realidad, para el código C no tienes suerte. Sin embargo, para el código C ++, puede encontrar información de versiones de símbolos. Algunas funciones de las bibliotecas de tiempo de ejecución de C ++ son específicas de la versión y están marcadas como tales en los archivos de objeto. Prueba esto:

 readelf -Wa file.exe | grep 'GCC[[:alnum:]_.]*' --only-match | sort | uniq | tail -n 1 

Sin embargo, no le mostrará la versión de GCC utilizada. Lo que muestra es la versión de símbolos en tiempo de ejecución suministrada al comstackdor. Por lo general, el tiempo de ejecución es el de un envío de comstackdor, y su versión no es inferior a la que se muestra con el comando anterior.

Esta información no se almacena en el objeto comstackdo.

Puedes usar la utilidad elfinfo . Esto también permite detectar las versiones de comstackción de Go y FPC, además de GCC.