我们可以从 elf 二进制文件中获取编译器信息吗?

我们可以从 elf 二进制文件中获取编译器信息吗?

有机会了解 Linux 下二进制文件是如何构建的吗? (和/或其他 Unix)

编译器、版本、时间、标志等...

我查看了readelf但找不到太多,但可能还有其他方法来分析二进制代码/部分等......

你知道如何提取吗?

答案1

没有一种通用的方法,但您可以通过查找仅由一个编译器完成的事情来做出有根据的猜测。

GCC 是最简单的;它写入一个.comment包含 GCC 版本字符串的部分(与运行时得到的字符串相同gcc --version)。我不知道是否有办法用 来显示它readelf,但用objdump它是:

objdump -s --section .comment /path/binary

我刚刚意识到我忽略了你问题的其余部分。标志通常不会保存在任何地方;他们很可能会出现在评论部分,但我从未见过这样做。 COFF 标头中有一个位置用于时间戳,但 ELF 中没有相应的位置,因此我认为编译时间也不可用

答案2

怎么样:

readelf -p .comment a.out

答案3

您可以尝试使用该strings命令。它将创建大量文本输出;通过检查你可能会猜到编译器。

pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3

在这里我知道它是用它编译的,gcc但您始终可以将strings输出重定向到文件并检查它。

有一个非常好的实用程序叫做peid对于 Windows,但我在 Linux 上找不到任何替代方案。

答案4

readelf或者objdump两者都可以做到这一点。

gcc编译的ELF文件会添加.note.ABI-tag.note.gnu.build-id部分。两者都可以通过以下方式显示:

objdump -sj .note.ABI-tag ELFFILE
objdump -sj .note.gnu.build-id ELFFILE

选项“s”表示显示完整内容,“j”表示部分名称。此样式获取该部分的十六进制内容。

该命令readelf -n将显示一次 ELFFILE 的人类可读内容。选项“n”表示注释。选择您喜欢的一款。

顺便说一句,使用objcopy,您可以在 elf 文件中添加您自己的部分。

相关内容