vs生成的map文件详解

目录

1.如何设置生成map文件

2.map文件内容

1.首部信息

2.段(section)信息——information about the sections in this module

1.sections的介绍:

2.内存分布

3.函数信息——actual symbolic information

4.静态符号


1.如何设置生成map文件

打开项目属性-》链接器-》调试–》生成映射文件: 选择 是(/map)

链接阶段生成的map文件

命令行参数是/map

map就是一个映射文件,猜测是映射符号和地址之间的关系。因为真正的执行阶段不需要符号的信息,只需要地址。而exe里面应该就是都是地址,不知道是具体的符号。而pdb正好是符号信息。

pdb文件

pdb和map文件均为调试用

pdb记录,数据和调试信息(/DEBUG(生成调试信息) | Microsoft Docs),程序p数据d库b,

它将所有符号的列表及其地址(可能还有文件名和声明符号的行)存储在模块中。

符号文件(pdb)是针对被调试系统而言,

如果被调试的系统是xp,那么应该下载和安装xp的符号文件

如果被调试的系统是Win7,那么应该下载和安装Win7的符号文件,

不同系统对应的符号文件是不同的,一定要匹配

可能需要下载对应的离线符号文件包,如果在线找不到。

2.map文件内容

map文件的类型就是LinkerAddressMap

map记录地址、长度等信息(/MAP(生成映射文件) | Microsoft Docs

网上介绍map文件内容的资料比较少,下面是搜到的参考的资料

Using MAP files - part 1 | Microsoft Docs

map文件是一个text文件,文本文件,所以可以打开文本编辑器查看。

1.首部信息

第一行 模块名字(不修改就是文件名啦)

第二行 link.exe 链接模块的时间戳(fromthe program file header ,not the file system)

第三行 首选的加载地址(可简记为 PLA ) Preferred load address,只是首选而已,不一定是真正的加载到这个地址。一般exe的首选地址都是00400000。一般exe就是这个地址,但是dll就不一定了,因为dll有很多,不可能都加载到这个地址上,如果这个地址已经被用了,就用进行地址rebase。(现在win10加载的进程一般不是这个地址了,在打印崩溃额外信息的时候,最好获取进程的及地址:DWORD baseAddress = (DWORD) GetModuleHandle(NULL);,ps:打印地址格式化符号用: 0x%x

2.段(section)信息——information about the sections in this module

这里说的段是section而不是segment,segment会把权限相同的section给合并了的。具体见之前的文章。

a list of groups in the program.

Start 使用的是 段地址形式 = 段号 : 段内偏移

Length 自然就是这个section的长度。

Name 段的名字 (groupname)

Class 段的类型(数据段 代码段)

1.sections的介绍:

参考:PE 格式 - Win32 apps | Microsoft Docs

Section Name

Content

Characteristics

.text

只读

Executable code (free format)

IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IIMAGE_SCN_MEM_READ

.bss

读写

Uninitialized data (free format)

IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE

.data

?读写

Initialized data (free format)

IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE

.rdata

Read-only initialized data

IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

.edata

Export tables

IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

.idata

Import tables

IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE

.xdata

Exception information (free format)

IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

1 .text 代码段是存放了程序代码的数据,假如机器 中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。

2 .bss 和 .data 挨在一起,都是放在一个段里的,0004段。

bss段由于都是到时候初始化为0,所以不需要包含字节数据 better save space

全局变量 如果初始化了就放在data区,如果没有初始化就放在bss区

.bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);

而.data却需要占用,其内容由程序初始化。

(const全局变量和static全局变量不知道放在哪里,找不到。)

3 .rdata Read-only initialized data:只读的初始化的数据:比如const数据

4 .edata Export tables: 其他映像文件可以访问的符号,通常在dll中会有导出符号

5 .idata Import tables

2.内存分布

图来自 什么是代码区、常量区、静态区(全局区)、堆区、栈区?_夜风的博客-CSDN博客_常量区

对应上述map中的段区。 低地址开始 只读,读写,运行时分配

0002 应该是代码区,只读

0003 应该是常量区,只读

0004 应该是静态区

堆区和栈区 在程序运行起来以后才会有,所以map中没有对应的。

3.函数信息——actual symbolic information

the entry point.

前面的 Address 是分段地址,0000,0001,0002、、、表示段号,后面的表示段内的偏移 。

可以推算出:

0001 段的起始地址是 0x00001000

0002 段的起始地址是 0x00011000

截取一行分析:

Rva+Base = 00411690

因为base是Referred Load Address,Base = 00400000

所以Rva = 00011690 RVA是Relative Virtual Address 称为相对虚拟地址, 是基于Base来说

也就是相对于基地址的偏移是00011690

也就是等于前面的Address

0002:00000690 = 00011690 (0002段起始地址从 00011000开始 + 690 = 11690)

1.后面有f代表的是 function 函数信息。

2.后面的main.obj 说明这个函数来着 main.obj (main.obj main.cpp–>main.obj ),说明前面两个函数所在的源文件应该是main.c 或者 main.cpp

解析符号名:

打开vs的控制台窗口。输入:

undname符号名

c++ - Demangling in MSVC - Stack Overflow

4.静态符号


dump文件

todo


pdb文件

todo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值