【发布时间】:2025-12-26 00:15:12
【问题描述】:
我有一个非常简单的问题,但我还没有找到答案,所以我开始了: 我正在使用一个共享库,我想知道它是否已使用优化标志(例如 -O3)进行编译。
有没有办法找到这些信息?
非常感谢
【问题讨论】:
-
您是否期待精确的优化标志或简单的想法是否维护调试符号?我想了解您为什么要寻找 O3?
标签: c++ optimization compilation
我有一个非常简单的问题,但我还没有找到答案,所以我开始了: 我正在使用一个共享库,我想知道它是否已使用优化标志(例如 -O3)进行编译。
有没有办法找到这些信息?
非常感谢
【问题讨论】:
标签: c++ optimization compilation
如果您使用gcc 4.3 或更高版本,请查看-frecord-gcc-switches。构建二进制文件后,使用readelf -n 阅读注释部分。
更多信息可以在这里找到Detect GCC compile-time flags of a binary
【讨论】:
除非首先编译该库的人使用编译器以某种方式将这些标志保存到二进制文件中(我认为只有最近的 GCC 允许这样做,并且可能是 clang),否则本质上无法确切知道使用了哪些标志。当然,如果您在组装方面有很多经验,您可以扣除很多(例如“这看起来像一个自动展开的循环”、“这看起来像是针对A xor A 比A := 0x0"等)。
通常,总有不同的源代码最终会成为相同的编译代码,因此无法判断编译的内容是首先“手动”优化的,还是在许多情况下已经看到编译器优化。
此外,还有很多 C++ 编译器,这些编译器的很多版本,甚至更多标志...
现在,您的问题来自某处;我猜你问这个是因为
现在,1. 确实与优化级别无关;当然,你优化得越多,你的字节码对应的“源代码行”就越少,但你仍然可以有调试符号。
第二点:我学到了一个艰难的方法,除非我成功地排除了所有其他替代方案,否则我是错误的罪魁祸首(而不是我的编译器)。
第三点:总是有优化的空间,但这对你没有帮助,除非你自己重新编译库。如果您重新编译,您将设置标志,因此无需首先确定它们是否已设置。如果您无法重新编译:知道有空间对您没有帮助。如果您只是从复杂的构建过程中获取库:大多数构建系统都会给您留下一个包含编译器标志等内容的日志。
【讨论】: