这里我有一个不知道其构建环境的可执行文件,假设使用gcc/g++。有没有办法找出编译过程中使用的优化标志(如O0、O2…)?
所有方法都是受欢迎的,无论是通过分析二进制文件还是通过gdb进行一些调试测试(如果我们假设在编译过程中可以使用-g标志)。
如果幸运的话,命令行存在于可执行文件本身中,这取决于所使用的操作系统和文件格式。如果是Elf文件,请尝试使用GNU binutils 中的objdump
转储内容
我真的不知道这是否有帮助,但在反汇编(objdump-d)中检查O0非常容易,因为生成的代码根本没有优化,并且添加了一些指令来简化调试。
通常在x86上,函数的序言包括保存堆栈指针(我认为是用于回溯)。因此,例如,如果你定位了主功能,你应该看到这样的东西:
main:…推送%rbp…mov%rsp,%rbp
您应该在函数的几乎每一个开头都看到这种"模式"。对于其他目标(我不知道你的目标平台是什么),你应该在序言中或函数调用之前看到或多或少相似的组装序列。
对于其他优化级别,事情要复杂得多。
很抱歉一直含糊其辞,没有回答整个问题。。。只是希望它能有所帮助。