【Visual Studio】查看符号导入信息
概述:通过 map 文件查看引入的函数都是从哪个文件导入的
0x01 问题描述
两个项目引入了同样的 lib 文件,一个编译没问题,但是另外一个编译报错链接错误,遇到这样的问题你该怎么办?
:可以使用编程成功工程的 map 文件查看函数是通过哪个 lib 被链接到目标文件的
0x02 配置生成 map
步骤一:关闭增量链接
步骤二:开启生成映射文件并设置映射文件名
配置完成之后编译工程就能生成 map 文件了。
可以查看 map 文件查看导入函数的一些信息。
0x03 map 分析示例
一段 map 文件内容
1 |
|
解析:
这段内容来自于一个 .map
文件,它是链接器在编译和链接过程结束后生成的,包含了程序中符号的地址、类型和一些其他信息。这个特定的 .map
文件片段列出了与 zlib 压缩库相关的一些函数。以下是对这些条目的分析:
-
每一列的具体含义可能因编译器和链接器的不同而略有不同,但通常包括:
- 地址:符号在内存中的地址。
- 装饰后的名称:C++ 编译器可能会对函数名称进行装饰,以包含关于函数签名的信息。
- 原始名称:如果装饰后的名称存在,原始名称也会被列出。
- 大小:符号的大小(通常是函数的代码大小)。
- 段:符号所在的内存段。
- 文件名:符号定义的源文件。
-
_crc32@12
、_crc32_z@12
、_crc32_combine@12
、_crc32_combine64@16
:这些是 CRC32 校验函数的不同版本,@12
和@16
表示函数的参数大小(以字节为单位)。CRC32 是一种常用的数据校验算法。 -
_get_crc_table@0
:这个函数可能返回一个 CRC32 表的指针,该表用于优化 CRC32 计算。 -
_deflate@8
、_deflateEnd@4
、_deflateSetDictionary@12
、_deflateGetDictionary@12
、_deflateCopy@8
:这些函数是 zlib 压缩库中用于数据压缩的不同函数。_deflate@8
是压缩数据的主要函数,而_deflateEnd@4
用于清理压缩流。_deflateSetDictionary@12
和_deflateGetDictionary@12
用于设置和获取压缩字典,这可以提高压缩效率。_deflateCopy@8
可能用于复制压缩流的状态。 -
每个函数后面的
f
可能表示这些符号是文件(file)级别的,即它们是可执行文件或库文件的一部分,而不是导入的。 -
zlibstat_VC2017_x86_MTd:crc32.obj
和zlibstat_VC2017_x86_MTd:deflate.obj
表示这些符号分别来自crc32.obj
和deflate.obj
对象文件,这些对象文件是zlibstat_VC2017_x86_MTd
项目或解决方案的一部分。VC2017_x86_MTd
可能表示这是用 Visual Studio 2017 编译的,针对 x86 平台,使用了多线程(MT)调试(d)配置。
通过分析 .map
文件,开发者可以更好地理解程序的内存布局和符号信息,这对于调试和性能分析非常有用。