c – 确定哪个编译器构建Win32 PE

前端之家收集整理的这篇文章主要介绍了c – 确定哪个编译器构建Win32 PE前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何确定哪个C或C编译器用于构建特定的 Windows可执行文件或DLL?一些编译器在最终的可执行文件中留下版本字符串,但这似乎在Windows上比在 Linux上更少.

具体来说,我有兴趣区分Visual C和各种MinGW编译器(通常功能签名相当简单),然后在Visual C版本(2002,2003,2005,2008之间更难做)中.那里有一个可以半可靠的区别的工具吗?

解决方法

一个区别VC版本的提示的一个来源是链接的特定C运行时库.由于默认情况是(至少在现代版本)链接到DLL,这是很容易做到的.实用程序 Dependency Walker几乎不可缺少,用于验证您是否知道正在加载哪些DLL,它会告诉您正在使用哪个C运行时DLL.虽然Dependency Walker包含在Microsoft Platform SDK中,但它已经被独立扩展,我链接站点是其当前开发的所在.

默认情况下,VC6和MinGW都链接到MSVCRT.DLL,所以这不区分它们.通过一些努力,MinGW也可以链接到后来的C运行时版本,所以你需要独立排除MinGW.

Runtime       VC Version
----------    -------------
MSVCRT.DLL    VC6
MSCVR80.DLL   VC8 (VS 2005)
MSCVR90.DLL   VC9 (VS 2008)

其他运行时DLL也是很好的线索,例如引用Delphi的运行时可能表明EXE实际上是从Delphi构建的,而不是C工具链.

如果符号尚未从.EXE文件删除,则可能会找到一些内部符号存在的线索.例如,对_sjlj_init之类的引用可能表示在某些时候涉及到针对setjmp / longjmp异常处理配置的MinGW GCC 3.x.

猜你在找的C&C++相关文章