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

elm*_*rco 62 linux debugging compiler executable elf

有没有机会知道在 Linux 下如何构建二进制文件?(和或其他 Unix)

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

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

你知道怎么提取吗?

Mic*_*zek 57

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

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

objdump -s --section .comment /path/binary
Run Code Online (Sandbox Code Playgroud)

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


小智 31

怎么样:

readelf -p .comment a.out
Run Code Online (Sandbox Code Playgroud)

  • 更干净的输出格式。 (11认同)
  • 这与 Michael 的 `objdump` 有何不同?它提供更多信息吗?在不同平台上可用?更干净的输出格式? (3认同)

Hem*_*ant 22

您可以尝试使用该strings命令。它会产生大量的文本输出;通过检查它,您可能会猜到编译器。

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

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

有一个非常好的peidWindows实用程序,但我在 Linux 上找不到任何替代品。

  • +1,允许您查看编译标志(如果是 gcc) (3认同)

小智 6

有两种方法。两者都会给出相同的结果

objdump -s --section .comment path/to/binary
Run Code Online (Sandbox Code Playgroud)

使用 readelf 命令,readelf -S binary 将显示二进制文件中的 40 个部分标题。请注意.comment 节标题的序列号 。在我的系统中,它显示为 27(您的情况可能会有所不同)

readelf -x 30 path/to/binary -> 这将显示部分 '.comment' 的十六进制转储。在该转储中,您可以看到用于构建二进制文件的编译器。


小智 5

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

gcc 编译的 ELF 文件会添加 .note.ABI-tag 和 .note.gnu.build-id 两个部分。两者都可以通过

objdump -sj .note.ABI-tag ELFFILE
objdump -sj .note.gnu-build-id ELFFILE
Run Code Online (Sandbox Code Playgroud)

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

readelf -n
Run Code Online (Sandbox Code Playgroud)

将显示一次 ELFFILE 的人类可读内容。选项“n”表示注释。

选择一个你喜欢的。

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