从可执行文件中找出编译优化标志
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
你应该在函数的几乎每一个开头看到这个“模式”。 对于其他目标(我不知道您的目标平台是什么),您应该在序言中或函数调用之前看到或多或少相似的组装序列。
对于其他优化级别,事情要复杂得多。
抱歉,我一直含糊不清,没有回答整个问题……希望对您有所帮助。
【讨论】:
以上是关于从可执行文件中找出编译优化标志的主要内容,如果未能解决你的问题,请参考以下文章
Apparmor:是不是可以从可执行文件中调用另一个可执行文件?