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



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

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

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

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

通常在x86上,函数的序言包括保存堆栈指针(我认为是用于回溯)。因此,例如,如果你定位了主功能,你应该看到这样的东西:

main:…推送%rbp…mov%rsp,%rbp

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

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

很抱歉一直含糊其辞,没有回答整个问题。。。只是希望它能有所帮助。

最新更新