Microsoft Visual Studio导入库的格式

问题描述 投票:0回答:1

众所周知,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)。我找不到有关这些导入对象格式的任何文档。有谁知道这个格式吗?

可能是非官方规格?

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

c++ c visual-studio format static-libraries
1个回答
3
投票

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

“Short import”标头与常规 COFF 标头的不同之处在于前四个签名字节:

0x00 0x00 0xFF 0xFF
(常规 COFF 不能以此开头,因为它会读作“未知机器,65535 个部分”,这是无意义的)。

“短导入”标头的格式完整描述如下:MSDN PE 格式

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

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

© www.soinside.com 2019 - 2024. All rights reserved.