C++ Microsoft Visual Studio导入库的格式

C++ Microsoft Visual Studio导入库的格式,c++,c,visual-studio,format,lib,C++,C,Visual Studio,Format,Lib,众所周知,Visual Studio库*.lib文件是一个Unix“ar”归档文件,其中包含COFF格式的对象模块。但我发现用于导入DLL的库是不是COFF对象的小块(或存根)的存档。例如,库VS15\lib\ucrt\ucrt.lib。这些块包含函数名和对定义此函数的DLL库的引用。下面是“puts”函数的存根示例(十六进制转储): 00-00-FF-FF-00-00-4C-01-39-E9-80-55-26-00-00-00 ......L.9..U&... 93-00-08-00-

众所周知,Visual Studio库*.lib文件是一个Unix“ar”归档文件,其中包含COFF格式的对象模块。但我发现用于导入DLL的库是不是COFF对象的小块(或存根)的存档。例如,库VS15\lib\ucrt\ucrt.lib。这些块包含函数名和对定义此函数的DLL库的引用。下面是“puts”函数的存根示例(十六进制转储):

00-00-FF-FF-00-00-4C-01-39-E9-80-55-26-00-00-00 ......L.9..U&...
93-00-08-00-5F-70-75-74-73-00-61-70-69-2D-6D-73 “..._puts.api-ms
2D-77-69-6E-2D-63-72-74-2D-73-74-64-69-6F-2D-6C -win-crt-stdio-l
31-2D-31-2D-30-2E-64-6C-6C-00                   1-1-0.dll.
它肯定不是COFF对象(尽管它包含特定于COFF的386体系结构签名0x14C)。我找不到有关这些导入对象格式的任何文档。有人知道这种格式吗

可能是非官方规格


可能是一些可以处理此格式的源代码?

这就是所谓的Microsoft“短导入”对象。基本上,它由20个字节的头(与常规COFF头大小相同)组成,后跟两个以零结尾的字符串:导入符号名和DLL名

“Short import”头在前四个签名字节中与常规COFF头不同:
0x00 0x00 0xFF 0xFF
(常规COFF不能以此开头,因为它将被读取为“未知机器,65535节”,这是无意义的)

“短导入”标题的格式在此处有详细说明:

因此,在上述示例中,我们有:

0x00 0x00 0xFF 0xFF-->“短导入”签名
0x00 0x00-->版本0(未使用)
0x4C 0x01-->机器I386
0x39 0xE9 0x80 0x55-->时间/日期戳(2015年6月17日,UTC时间6:27:53)
0x26 0x00 0x00 0x00-->头后面字符串的大小(38字节)
0x93 0x00-->序号/提示(147)
0x08 0x00-->位字段(“代码”,按“名称”导入)


这有帮助吗:?我很了解这个文档,这是我的手册。遗憾的是,它只描述了传统的COFF对象模块,而不描述导入存根。请注意,ucrt导入库甚至比普通导入库更为特殊:它们可能包含加载特定版本的dll的特殊逻辑。请参阅,例如,了解为什么仅仅为ucrt dll生成导入库会做错误的事情。@rubenvb检查ucrt.lib我没有注意到除了模块枚举而不是名称之外的任何特殊逻辑。从技术角度来看,它是一个普通的库,但是COFF模块被这些块所取代。有一种简单的方法可以得到类似的结果——只需将DLL(通过DEF)转换为库即可。我制作了一个包含单个函数定义的简单test.def,并制作了*.lib。结果完全一样。@Serge ok。那么,链接中描述的问题就在别处。也许事实是,从ucrt dll生成def文件并链接到从该dll生成的导入库将不起作用。但我相信这和你的问题无关。