如何检索用于编译给定ELF可执行文件的GCC版本?


Answers:


82

它通常存储在注释部分

返回GCC:(GNU)XXX

不返回任何输出

剥离.comment(以及.note)部分以减小尺寸的情况很常见。

注意:默认情况下,busybox字符串指定-a选项,.comment部分需要此选项

编辑:与Berendra Tusla的回答相反,它不需要使用任何调试标志进行编译,此方法才能起作用。

二进制示例:

对象示例:

请注意,不存在任何-g(调试)标志,并且存在-s标志,该标志会去除不需要的符号。除非删除.comment部分,否则GCC信息仍然可用。如果需要保持此信息不变,则可能需要检查makefile(或适用的生成脚本)以验证-fno-ident不在$ CFLAGS中,并且$ STRIP命令缺少-R .comment。-fno-ident阻止gcc从注释部分开始生成这些符号。


1
“正常”是什么意思?使用默认选项完成编译后,我的编译器/版本不会存储此信息。
康拉德·鲁道夫2012年

我使用的是在OS X上编译的GCC 4.6.2,但未应用任何特定于系统的补丁。这是香草的GCC。
康拉德·鲁道夫2012年

没事 如果我在源代码中包含文字字符串,则可以通过找到正确的字符串strings
康拉德·鲁道夫2012年

您需要将-a选项指定为strings,因为.comment默认情况下该实用程序不会在该部分中查找。
jkoshy 2012年

2
objdump -s --section .comment foo.o将注释部分转储到屏幕上
MarcH 2013年

20

要完成别人说的话:除非您使用调试信息进行编译否则它不会存储在对象(或exe)文件中!(选项-g)。如果使用调试信息进行编译,则可以使用以下命令将其取回readelf

看看怎么说GNU C 4.4.3 20100108 (prerelease)


9

我在这里刚刚读过的另外两种方式(也许更简单):https : //unix.stackexchange.com/questions/719/can-we-get-compiler-information-from-an-elf-binary


对此进行一点扩展:该-p选项在我的readelf(from binutils 2.14)的古代副本中不存在,因此我不得不找到.comment节的索引,然后像这样十六进制转储它:readelf --hex-dump=$(readelf -S <so_file> | grep .comment | awk '{ print $1 }' | tr -d '[]') <so_file>
tkocmathla 2014年

2

此信息未存储在已编译的对象(c)中。

实际上,对于C代码,您完全不走运。但是,对于C ++代码,您可能会从符号版本中找到一些信息。C ++运行时库中的某些函数是特定于版本的,并在目标文件中被标记为此类。尝试这个:

但是,它不会显示使用的GCC版本。它显示的是运行时提供给编译器的符号版本。通常,运行时是编译器出厂的运行时,其版本不少于以上命令显示的运行时。


好,谢谢大家!无法弄清楚为什么这么重要的信息没有进入ELF标头。我的目标实际上是嵌入式Linux内核。
伊莉丝·古塔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.