MSVC的版本和其DLL的对应关系如下所示。
市场发行的版本 |
内部版本 |
命令行版本 |
能导入的DLL的版本 |
发行日期 |
---|---|---|---|---|
6 |
6.0 |
12.00 |
msvcrt.dll, msvcp60.dll |
June 1998 |
.NET (2002) |
7.0 |
13.00 |
msvcr70.dll, msvcp70.dll |
February 13, 2002 |
.NET 2003 |
7.1 |
13.10 |
msvcr71.dll, msvcp71.dll |
April 24, 2003 |
2005 |
8.0 |
14.00 |
msvcr80.dll, msvcp80.dll |
November 7, 2005 |
2008 |
9.0 |
15.00 |
msvcr90.dll, msvcp90.dll |
November 19, 2007 |
2010 |
10.0 |
16.00 |
msvcr100.dll, msvcp100.dll |
April 12, 2010 |
2012 |
11.0 |
17.00 |
msvcr110.dll, msvcp110.dll |
September 12, 2012 |
2013 |
12.0 |
18.00 |
msvcr120.dll, msvcp120.dll |
October 17, 2013 |
msvcp*.dll含有C++相关函数,因此导入这些DLL文件的可执行程序很可能是C++程序。
名字通常都是以“?”开始的。
有关MSVC命名规则的详细介绍,请参考本书51.1.1节。
GCC不仅可以编译*NIX平台的应用程序,在Cygwin和MinGW环境下它同样可以编译面向Win32平台的应用程序。
命名通常以符号“_Z”开始。
有关GCC命名规则的详细介绍,请参考本书51.1.1节。
GCC在Cygwin环境下编译的应用程序,通常会导入cygwin1.dll文件。
GCC在Cygwin环境下编译的应用程序,可能会导入msvcrt.dll文件。
由Intel Fortran编译的应用程序,可能会导入以下3个文件:
① Libifcoremd.dll。
② Libifportmd.dll。
③ Libiomp5.dll(支持OpenMP)。
库文件libifcoremd.dll定义了很多以字符串“for_”开头的函数。它就是FORTRAN的代表性前缀。
由Watcom编译出来的程序,其符号名称通常以“W”字母开头。
以W?method$_class$n__v为例:大写字母W开头代表它是Watcom编译出来的程序,方法的名称为method,类的名称为class,没有参数且无返回值的void方法会命名为:
W?method$_class$n__v
下面所示的是Borland Delphi编译器以及C++ Builder的命名规范:
@TApplication@IdleAction$qv
@TApplication@ProcessMDIAccels$qp6tagMSG
@TModule@$bctr$qpcpvt1
@TModule@$bdtr$qv
@TModule@ValidWindow$qp14TWindowsObject
@TrueColorTo8BitN$qpviiiiiit1iiiiii
@TrueColorTo16BitN$qpviiiiiit1iiiiii
@DIB24BitTo8BitBitmap$qpviiiiiit1iiiii
@TrueBitmap@$bctr$qpcl
@TrueBitmap@$bctr$qpvl
@TrueBitmap@$bctr$qiilll
由Borland编译出来的程序,其符号名称必定以字符“@”开头,后面几个字母分别代表:类名称、方法名称以及方法的参数类型。
这些符号名称可能出现在exe文件的输入表、dll文件的输出表以及调试数据等地方。
VCL的全称是Borland Visual Component Libraries,意思是Borland的可视化组件库。它们保存在bpl文件中,而不是保存在dll文件中。比如说文件vcl50.dll和rtl60.dll。
由Borland编译出来的程序还可能会导入BORLNDMM.DLL文件。
通过观察我们不难看出,几乎所有的Delphi可执行文件在代码段的起始部分都有一个“Boolean”字符串,后面还跟着其他数据类型的类型名称。
这里列出一个非常典型的Delphi程序的代码段片段,它就位于Win32程序的PE头之后。
00000400 04 10 40 00 03 07 42 6f 6f 6c 65 61 6e 01 00 00 |..@...Boolean...|
00000410 00 00 01 00 00 00 00 10 40 00 05 46 61 6c 73 65 |........@..False|
00000420 04 54 72 75 65 8d 40 00 2c 10 40 00 09 08 57 69 |.True.@.,.@...Wi|
00000430 64 65 43 68 61 72 03 00 00 00 00 ff ff 00 00 90 |deChar..........|
00000440 44 10 40 00 02 04 43 68 61 72 01 00 00 00 00 ff |D.@...Char......|
00000450 00 00 00 90 58 10 40 00 01 08 53 6d 61 6c 6c 69 |....X.@...Smalli|
00000460 6e 74 02 00 80 ff ff ff 7f 00 00 90 70 10 40 00 |nt..........p.@.|
00000470 01 07 49 6e 74 65 67 65 72 04 00 00 00 80 ff ff |..Integer.......|
00000480 ff 7f 8b c0 88 10 40 00 01 04 42 79 74 65 01 00 |......@...Byte..|
00000490 00 00 00 ff 00 00 00 90 9c 10 40 00 01 04 57 6f |..........@...Wo|
000004a0 72 64 03 00 00 00 00 ff ff 00 00 90 b0 10 40 00 |rd............@.|
000004b0 01 08 43 61 72 64 69 6e 61 6c 05 00 00 00 00 ff |..Cardinal......|
000004c0 ff ff ff 90 c8 10 40 00 10 05 49 6e 74 36 34 00 |......@...Int64.|
000004d0 00 00 00 00 00 00 80 ff ff ff ff ff ff ff 7f 90 |................|
000004e0 e4 10 40 00 04 08 45 78 74 65 6e 64 65 64 02 90 |..@...Extended..|
000004f0 f4 10 40 00 04 06 44 6f 75 62 6c 65 01 8d 40 00 |..@...Double..@.|
00000500 04 11 40 00 04 08 43 75 72 72 65 6e 63 79 04 90 |..@...Currency..|
00000510 14 11 40 00 0a 06 73 74 72 69 6e 67 20 11 40 00 |..@...string .@.|
00000520 0b 0a 57 69 64 65 53 74 72 69 6e 67 30 11 40 00 |..WideString0.@.|
00000530 0c 07 56 61 72 69 61 6e 74 8d 40 00 40 11 40 00 |..Variant.@.@.@.|
00000540 0c 0a 4f 6c 65 56 61 72 69 61 6e 74 98 11 40 00 |..OleVariant..@.|
00000550 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000560 00 00 00 00 00 00 00 00 00 00 00 00 98 11 40 00 |..............@.|
00000570 04 00 00 00 00 00 00 00 18 4d 40 00 24 4d 40 00 |.........M@.$M@.|
00000580 28 4d 40 00 2c 4d 40 00 20 4d 40 00 68 4a 40 00 |(M@.,M@. M@.hJ@.|
00000590 84 4a 40 00 c0 4a 40 00 07 54 4f 62 6a 65 63 74 |.J@..J@..TObject|
000005a0 a4 11 40 00 07 07 54 4f 62 6a 65 63 74 98 11 40 |..@...TObject..@|
000005b0 00 00 00 00 00 00 00 06 53 79 73 74 65 6d 00 00 |........System..|
000005c0 c4 11 40 00 0f 0a 49 49 6e 74 65 72 66 61 63 65 |..@...IInterface|
000005d0 00 00 00 00 01 00 00 00 00 00 00 00 00 c0 00 00 |................|
000005e0 00 00 00 00 46 06 53 79 73 74 65 6d 03 00 ff ff |....F.System....|
000005f0 f4 11 40 00 0f 09 49 44 69 73 70 61 74 63 68 c0 |..@...IDispatch.|
00000600 11 40 00 01 00 04 02 00 00 00 00 00 c0 00 00 00 |.@..............|
00000610 00 00 00 46 06 53 79 73 74 65 6d 04 00 ff ff 90 |...F.System.....|
00000620 cc 83 44 24 04 f8 e9 51 6c 00 00 83 44 24 04 f8 |..D$...Ql...D$..|
00000630 e9 6f 6c 00 00 83 44 24 04 f8 e9 79 6c 00 00 cc |.ol...D$...yl...|
00000640 cc 21 12 40 00 2b 12 40 00 35 12 40 00 01 00 00 |.!.@.+.@.5.@....|
00000650 00 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00 |................|
00000660 46 41 12 40 00 08 00 00 00 00 00 00 00 8d 40 00 |FA.@..........@.|
00000670 bc 12 40 00 4d 12 40 00 00 00 00 00 00 00 00 00 |..@.M.@.........|
00000680 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000690 bc 12 40 00 0c 00 00 00 4c 11 40 00 18 4d 40 00 |..@.....L.@..M@.|
000006a0 50 7e 40 00 5c 7e 40 00 2c 4d 40 00 20 4d 40 00 |P~@.\~@.,M@. M@.|
000006b0 6c 7e 40 00 84 4a 40 00 c0 4a 40 00 11 54 49 6e |l~@..J@..J@..TIn|
000006c0 74 65 72 66 61 63 65 64 4f 62 6a 65 63 74 8b c0 |terfacedObject..|
000006d0 d4 12 40 00 07 11 54 49 6e 74 65 72 66 61 63 65 |..@...TInterface|
000006e0 64 4f 62 6a 65 63 74 bc 12 40 00 a0 11 40 00 00 |dObject..@...@..|
000006f0 00 06 53 79 73 74 65 6d 00 00 8b c0 00 13 40 00 |..System......@.|
00000700 11 0b 54 42 6f 75 6e 64 41 72 72 61 79 04 00 00 |..TBoundArray...|
00000710 00 00 00 00 00 03 00 00 00 6c 10 40 00 06 53 79 |.........l.@..Sy|
00000720 73 74 65 6d 28 13 40 00 04 09 54 44 61 74 65 54 |stem(.@...TDateT|
00000730 69 6d 65 01 ff 25 48 e0 c4 00 8b c0 ff 25 44 e0 |ime..%H......%D.|
数据段(DATA)的头四个字节通常是以下三个组合中的一个任意一个:00 00 00 00、32 13 8B C0或者FF FF FF FF。在处理被压缩或者被加密的Dephi可执行文件时,这组常数就会具有指标性意义。
Vcomp*.dll。微软用来实现OpenMP的文件。