kqu*_*inn 10 c c++ compiler-construction executable disassembly
如何确定使用哪个C或C++编译器来构建特定的Windows可执行文件或DLL?一些编译器在最终的可执行文件中留下了版本字符串,但这在Windows上似乎比在Linux上更少见.
具体来说,我有兴趣区分Visual C++和各种MinGW编译器(通常很容易从函数签名),然后在Visual C++版本之间(6,2002/2003,2005,2008;更难做).有没有可以半可靠方式区分的工具?
RBe*_*eig 11
区分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)
Run Code Online (Sandbox Code Playgroud)
其他运行时DLL也是很好的线索,例如对Delphi运行时的引用可能表明EXE实际上是从Delphi构建的,而不是C工具链.
如果尚未从.EXE文件中删除符号,则可能会找到一些内部符号存在的线索.例如,对某些内容的引用_sjlj_init可能表示在某些时候涉及为setjmp/longjmp异常处理配置的MinGW GCC 3.x.
| 归档时间: |
|
| 查看次数: |
8044 次 |
| 最近记录: |