这里我有一个可执行文件而不知道它的构建环境,假设使用了gcc / g ++。 有没有办法找出编译过程中使用的优化标志(如O0,O2,...)?
欢迎所有方法,无论是通过gdb分析二进制或某些调试测试(如果我们假设编译期间-g标志可用)。
答案 0 :(得分:2)
如果幸运的话,命令行会出现在可执行文件本身中,具体取决于所使用的操作系统和文件格式。如果是Elf文件,请尝试使用GNU binutils
中的objdump
转储内容
答案 1 :(得分:-1)
我真的不知道这是否有帮助,但在反汇编(objdump -d)中检查O0非常容易,因为生成的代码根本没有优化,并添加了一些简化调试的指令。 / p>
通常在x86上,函数的序言包括保存堆栈指针(对于我认为的回溯)。因此,如果您找到主函数,您应该看到类似的内容:
...主要: ...推%rbp ... mov%rsp,%rbp
你应该看到这种"模式"几乎在每个函数的开头。 对于其他目标(我不知道你的目标平台是什么),你应该在序言中或在函数调用之前看到或多或少相似的汇编序列。
对于其他优化级别,事情变得更加棘手。
很抱歉保持模糊而不回答整个问题...希望它会有所帮助。
答案 2 :(得分:-4)
你可能不想这样做。
考虑一下......您是否希望使用根据用于编译它的优化选项来改变行为的代码?
如果没有 - 你为什么要写它?