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

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

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

【问题讨论】:

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

标签: c++ c optimization gcc g++


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2014-07-28
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      相关资源
      最近更新 更多