Microsoft Visual Studio 导入库的格式

Format of Microsoft Visual Studio import library

已知 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)。我找不到有关这些导入对象格式的任何文档。有人知道这种格式吗?

可能是非官方规格?

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

这是 so-called 微软 "short import" object。基本上,它由 20 个字节 header(与常规 COFF header 大小相同)组成,后跟两个 zero-terminated 字符串:分别是导入符号名称和 DLL 名称。

"Short import" header 在前四个签名字节中与常规 COFF header 不同:0x00 0x00 0xFF 0xFF(常规 COFF 不能以此开头,因为它会读取如"unknown machine, 65535 sections",这是无稽之谈。

"short import" header 的格式在这里有完整的描述:MSDN PE Format.

所以在上面的例子中我们有:

0x00 0x00 0xFF 0xFF --> "short import" signature
0x00 0x00 --> Version 0 (unused)
0x4C 0x01 --> Machine I386
0x39 0xE9 0x80 0x55 --> Time/Date stamp (17 Jun 2015, 6:27:53 UTC)
0x26 0x00 0x00 0x00 --> size of the strings following the header (38 bytes)
0x93 0x00 --> ordinal/hint (147)
0x08 0x00 --> bit field ("code", import by "name")