概述:通过 map 文件查看引入的函数都是从哪个文件导入的

0x01 问题描述

两个项目引入了同样的 lib 文件,一个编译没问题,但是另外一个编译报错链接错误,遇到这样的问题你该怎么办?

:可以使用编程成功工程的 map 文件查看函数是通过哪个 lib 被链接到目标文件的

0x02 配置生成 map

步骤一:关闭增量链接

步骤二:开启生成映射文件并设置映射文件名

配置完成之后编译工程就能生成 map 文件了。

可以查看 map 文件查看导入函数的一些信息。

0x03 map 分析示例

一段 map 文件内容

1
2
3
4
5
6
7
8
9
10
0001:00237500       _crc32@12                  10238500 f   zlibstat_VC2017_x86_MTd:crc32.obj
0001:00237520 _crc32_z@12 10238520 f zlibstat_VC2017_x86_MTd:crc32.obj
0001:00237770 _crc32_combine@12 10238770 f zlibstat_VC2017_x86_MTd:crc32.obj
0001:00237790 _get_crc_table@0 10238790 f zlibstat_VC2017_x86_MTd:crc32.obj
0001:00238470 _crc32_combine64@16 10239470 f zlibstat_VC2017_x86_MTd:crc32.obj
0001:00238490 _deflate@8 10239490 f zlibstat_VC2017_x86_MTd:deflate.obj
0001:002394b0 _deflateEnd@4 1023a4b0 f zlibstat_VC2017_x86_MTd:deflate.obj
0001:002395c0 _deflateSetDictionary@12 1023a5c0 f zlibstat_VC2017_x86_MTd:deflate.obj
0001:00239830 _deflateGetDictionary@12 1023a830 f zlibstat_VC2017_x86_MTd:deflate.obj
0001:002398d0 _deflateCopy@8 1023a8d0 f zlibstat_VC2017_x86_MTd:deflate.obj

解析:

这段内容来自于一个 .map 文件,它是链接器在编译和链接过程结束后生成的,包含了程序中符号的地址、类型和一些其他信息。这个特定的 .map 文件片段列出了与 zlib 压缩库相关的一些函数。以下是对这些条目的分析:

  1. 每一列的具体含义可能因编译器和链接器的不同而略有不同,但通常包括:

    • 地址:符号在内存中的地址。
    • 装饰后的名称:C++ 编译器可能会对函数名称进行装饰,以包含关于函数签名的信息。
    • 原始名称:如果装饰后的名称存在,原始名称也会被列出。
    • 大小:符号的大小(通常是函数的代码大小)。
    • :符号所在的内存段。
    • 文件名:符号定义的源文件。
  2. _crc32@12_crc32_z@12_crc32_combine@12_crc32_combine64@16:这些是 CRC32 校验函数的不同版本,@12@16 表示函数的参数大小(以字节为单位)。CRC32 是一种常用的数据校验算法。

  3. _get_crc_table@0:这个函数可能返回一个 CRC32 表的指针,该表用于优化 CRC32 计算。

  4. _deflate@8_deflateEnd@4_deflateSetDictionary@12_deflateGetDictionary@12_deflateCopy@8:这些函数是 zlib 压缩库中用于数据压缩的不同函数。_deflate@8 是压缩数据的主要函数,而 _deflateEnd@4 用于清理压缩流。_deflateSetDictionary@12_deflateGetDictionary@12 用于设置和获取压缩字典,这可以提高压缩效率。_deflateCopy@8 可能用于复制压缩流的状态。

  5. 每个函数后面的 f 可能表示这些符号是文件(file)级别的,即它们是可执行文件或库文件的一部分,而不是导入的。

  6. zlibstat_VC2017_x86_MTd:crc32.objzlibstat_VC2017_x86_MTd:deflate.obj 表示这些符号分别来自 crc32.objdeflate.obj 对象文件,这些对象文件是 zlibstat_VC2017_x86_MTd 项目或解决方案的一部分。VC2017_x86_MTd 可能表示这是用 Visual Studio 2017 编译的,针对 x86 平台,使用了多线程(MT)调试(d)配置。

通过分析 .map 文件,开发者可以更好地理解程序的内存布局和符号信息,这对于调试和性能分析非常有用。