从可执行文件中找出编译优化标志

Posted

技术标签:

【中文标题】从可执行文件中找出编译优化标志【英文标题】:Find out compilation optimization flag from executable 【发布时间】:2012-02-16 08:40:13 【问题描述】:

这里我有一个可执行文件,但不知道它的构建环境,假设使用的是 gcc/g++。 有没有办法找出编译期间使用的优化标志(如 O0、O2、...)?

欢迎所有方法,无论是通过分析二进制文件还是通过 gdb 进行一些调试测试(如果我们假设 -g 标志在编译期间可用)。

【问题讨论】:

这个问题可能会有所帮助:***.com/questions/189350/… 我会对这样一个请求的原因非常感兴趣。值得注意的是,您应该知道优化可以单独打开和关闭,并且O 级别只是为了方便起见的组。 该问题请特别参阅this informative answer。这是你不能可靠地做到这一点的确凿证据。 另外,由于函数属性,gcc 允许您在每个函数级别(或更粗略的范围,使用#pragma)打开和关闭优化。 【参考方案1】:

如果幸运的话,命令行会出现在可执行文件本身中,具体取决于所使用的操作系统和文件格式。如果是 Elf 文件,请尝试使用来自 GNU binutils 的 objdump 转储内容

【讨论】:

【参考方案2】:

我真的不知道这是否有帮助,但是在反汇编 (objdump -d) 中检查 O0 非常容易,因为生成的代码根本没有优化,并且添加了一些指令来简化调试。

通常在 x86 上,函数的序言包括保存堆栈指针(我想是为了回溯)。因此,例如,如果您定位到 main 函数,您应该会看到如下内容:

...主要: ...推%rbp ... mov %rsp,%rbp

你应该在函数的几乎每一个开头看到这个“模式”。 对于其他目标(我不知道您的目标平台是什么),您应该在序言中或函数调用之前看到或多或少相似的组装序列。

对于其他优化级别,事情要复杂得多。

抱歉,我一直含糊不清,没有回答整个问题……希望对您有所帮助。

【讨论】:

以上是关于从可执行文件中找出编译优化标志的主要内容,如果未能解决你的问题,请参考以下文章

从可执行文件 (.exe) 中恢复 NodeJS 代码

Apparmor:是不是可以从可执行文件中调用另一个可执行文件?

如何从可执行文件中提取数组?

从可执行文件创建 Windows 服务

是否可以在 Windows 上运行时从可执行文件中定位函数?

使用 def 文件从可执行文件中导出函数