是否有一个标志或其他可靠的方法来检测编译的C++二进制文件是否使用优化编译?
我对编译器特定的解决方案没问题.
编辑:这适用于构建部署系统,可能会意外部署未正确构建的二进制文件.不太可能采用防水解决方案,但如果可以在某些时候检测到这种情况,它可以节省一些痛苦(和金钱).
编译器通常是gcc,有时是sun,如果有MSVC解决方案,我不想为了社区的利益而排除它.
Max*_*ert 11
最新版本的GCC有一种方法来报告用于编译二进制文件的标志(第三个项目符号点).
有一个相关的命令行开关(--fverbose-asm)"只记录汇编器输出文件中的信息作为注释,因此信息永远不会到达目标文件." --frecord-gcc-switches开关"导致用于调用编译器的命令行被记录到正在创建的目标文件中."
如果我将被赋予这项任务,它将证明这是一项合理的任务.我会对可执行的反汇编中看到的模式进行"频率分析".作为程序员,我能够乍看之下区分优化和未优化(调试)代码.我会尝试将决策过程正式化,使用Visual Studio和x86平台,在未经优化的exe中看到的典型特征将是:
这绝对不是100%,但是如果使用更长的exe,我会期望结果非常可靠.
我假设对于其他x86平台,包括GCC,规则将类似,如果不相同,并且对于其他平台,可以找到类似的规则.
检测运行时库等其他启发式方法也可以正常工作,具体取决于编译器设置.
也就是说,我认为这样的任务"闻起来",在大多数情况下完全避免它是明智的.如果您将提供此类任务背后的真正原因,很可能会找到一些明智的解决方案.
我们使用的技术只是创建一个仅在构建调试时出现在每个库中的符号:
// included_by_everything.h
#ifdef (_DEBUG)
extern "C" __declspec( dllexport ) void WasBuiltInDebug() {}
#else
// nothing!
#endif
Run Code Online (Sandbox Code Playgroud)
然后在运行时(或在Perforce触发器中)加载每个模块时,我们可以通过简单地查找该符号来询问二进制文件是否进行调试:
bool IsDebugDLL( HMODULE DllHandle )
{
// this system call returns a nonzero address if it can
// find the symbol, and NULL otherwise:
return GetProcAddress( DllHandle , "WasBuiltInDebug" );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4466 次 |
| 最近记录: |