Visual Studio(2022)生成链接过程的.map映射文件以及.map映射文件的内容说明

微软的官方说明

/MAP(生成映射文件) | Microsoft Learn

设置步骤

        1. 右键项目属性, 连接器 -> 常规 -> 启用增量链接,设置为否。如下图:

        2. 连接器 -> 调试

                生成调试信息  设置为 生成调试信息 (/DEBUG)

                生成程序数据库文件  设置为 指定路径文件名,默认系统会自动设置

                生成映射文件  设置为  是 (/MAP)

                映射文件名  设置为 指定的完整路径, 例如 $(OutDir)$(TargetName).map 或者 aaa/Debug/test.map

                具体如下图:

                

                重新生成项目,成功生成,如下图所示:

部分.map文件示例内容如下所示:

demo_ccwindows

 Timestamp is 64eed0a8 (Wed Aug 30 13:16:24 2023)

 Preferred load address is 0000000140000000

 Start         Length     Name                   Class
 0001:00000000 00003290H .text$mn                CODE
 0001:00003290 00000040H .text$mn$00             CODE
 0001:000032d0 00000090H .text$x                 CODE
 0002:00000000 00000240H .idata$5                DATA
 0002:00000240 00000038H .00cfg                  DATA
 0002:00000278 00000008H .CRT$XCA                DATA
 0002:00000280 00000008H .CRT$XCAA               DATA
 0002:00000288 00000008H .CRT$XCZ                DATA
 0002:00000290 00000008H .CRT$XIA                DATA
 0002:00000298 00000008H .CRT$XIAA               DATA
 0002:000002a0 00000008H .CRT$XIAC               DATA
 0002:000002a8 00000008H .CRT$XIZ                DATA
 0002:000002b0 00000008H .CRT$XPA                DATA
 0002:000002b8 00000008H .CRT$XPZ                DATA
 0002:000002c0 00000008H .CRT$XTA                DATA
 0002:000002c8 00000008H .CRT$XTZ                DATA
 0002:000002d0 00000000H .gehcont$y              DATA
 0002:000002d0 00000000H .gfids$y                DATA
 0002:000002d0 00000ab0H .rdata                  DATA
 0002:00000d80 00000080H .rdata$CastGuardVftablesA DATA
 0002:00000e00 00000080H .rdata$CastGuardVftablesC DATA
 0002:00000e80 00000080H .rdata$voltmd           DATA
 0002:00000f00 00000360H .rdata$zzzdbg           DATA
 0002:00001260 00000008H .rtc$IAA                DATA
 0002:00001268 00000008H .rtc$IMZ                DATA
 0002:00001270 00000008H .rtc$IZZ                DATA
 0002:00001278 00000008H .rtc$TAA                DATA
 0002:00001280 00000008H .rtc$TMZ                DATA
 0002:00001288 00000008H .rtc$TZZ                DATA
 0002:00001290 0000042cH .xdata                  DATA
 0002:000016bc 00000000H .edata                  DATA
 0002:000016bc 0000003cH .idata$2                DATA
 0002:000016f8 00000018H .idata$3                DATA
 0002:00001710 00000240H .idata$4                DATA
 0002:00001950 0000059eH .idata$6                DATA
 0003:00000000 00020060H .data                   DATA
 0003:00020060 00000620H .bss                    DATA
 0004:00000000 00000468H .pdata                  DATA
 0005:00000000 00000060H .rsrc$01                DATA
 0005:00000060 00000180H .rsrc$02                DATA

  Address         Publics by Value              Rva+Base               Lib:Object

 0000:00000000       __AbsoluteZero             0000000000000000     <absolute>
 0000:00000000       ___safe_se_handler_count   0000000000000000     <absolute>
 0000:00000000       ___safe_se_handler_table   0000000000000000     <absolute>
 0000:00000000       __arm64x_extra_rfe_table   0000000000000000     <absolute>
 0000:00000000       __arm64x_extra_rfe_table_size 0000000000000000     <absolute>
 0000:00000000       __arm64x_native_entrypoint 0000000000000000     <absolute>

        有了这些信息,之后就可以通过.map文件查看编译生成的代码细节,以及分析相关程序问题。       

Rva: relative virtual address

关于.map文件结构的细节示例说明

Start

Length

Name

Class

0001:

00000000

00000304H

.text

CODE

       PE 格式 - Win32 apps | Microsoft Learn

      PE 格式 - Win32 apps | Microsoft Learn

     .debug 段,在对象文件中用于包含编译器生成的调试信息,在映像文件中用于包含生成的所有调试信息。 本段说明如何在对象和映像文件中打包调试信息。PE 格式 - Win32 apps | Microsoft Learn

     .bss 段(Block Started by Symbol segment), 未初始化数据(自由格式),一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。这里主要存放没有初始化的全局变量或者初始化为0值的全局变量。

     .sbss 段,用于存放 near ptr 寻址或者叫相对寻址的未初始化数据。

     .text 端,存放执行程序的代码。

     .data 段,初始化数据(自由格式),保存已经初始化的全局变量。

     .rdata 段,保存已经初始化的只读数据。

     .drective 段,指令段。链接器在处理信息后会删除 .drectve 节,因此该节不会出现在所链接的映像文件中。

     .edata 段,存放export symbols,包含有关其他映像可以通过动态链接访问的符号的信息。 导出的符号通常在 DLL 中找到,但 DLL 也可以导入符号。

     .idata 段,存放import symbols, 导入符号的所有映像文件都包含此.idata端。

     .pdata 段,包含用于异常处理的函数表条目的数组。

     .reloc 段,基址重定位表包含映像中所有基址重定位的条目。

     .tls 段, 为静态线程本地存储 (TLS) 提供直接 PE 和 COFF 支持。

     .rsrc 段,  资源按多级二进制排序树结构编制索引。

     .cormeta 段, 存放CLR元数据。

     .sxdata 段,对象的有效异常处理程序在该对象的 .sxdata 段中列出。

其他:

    1. vs生成的map文件详解_vs生成map文件_ivy_0709的博客-CSDN博客

    2. MAP File Contents - Debugging Applications - Visual Basic Planet

    3. Finding Crash Information Using the MAP File - CodeProject

     4.c - What does the "Rva+Base" mean in a MSVC linker generated map file? - Stack Overflow

...

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MFC 的单文档应用程序中画一个圆,可以使用 MFC 中提供的 CDC 类来操作设备上下文(DC)。以下是一个简单的示例: 1. 打开 Visual Studio,创建一个 MFC 单文档应用程序,选择“单文档”选项。 2. 在 View 类的头文件中添加以下代码: ```c++ class CMyView : public CView { protected: // 仅从序列化创建 CMyView() noexcept; DECLARE_DYNCREATE(CMyView) // 特性 public: CMyDoc* GetDocument() const; // 操作 public: // 重写 public: virtual void OnDraw(CDC* pDC); // 重写以描绘该视图 virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: // 实现 public: virtual ~CMyView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // 生成的消息映射函数 protected: DECLARE_MESSAGE_MAP() }; ``` 3. 在 View 类的源文件中添加 OnDraw 函数的定义,用于绘制圆: ```c++ void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // 获取视图的客户区域 CRect rect; GetClientRect(&rect); // 创建一个绿色的画刷 CBrush brush(RGB(0, 255, 0)); // 将画刷选入设备上下文 pDC->SelectObject(&brush); // 绘制一个圆形 pDC->Ellipse(rect); // 删除画刷 brush.DeleteObject(); } ``` 4. 运行程序,可以看到一个绿色的圆形被绘制在窗口中央。 在上述代码中,我们使用 CDC 类的 Ellipse 函数来绘制圆形,该函数的参数为一个矩形,表示圆形的边界矩形。我们可以使用 GetClientRect 函数获取视图的客户区域,然后将该矩形作为参数传递给 Ellipse 函数。同时,我们使用 CBrush 类来创建一个绿色的画刷,然后将其选入设备上下文,再绘制圆形,最后删除画刷。 以上就是在 MFC 单文档应用程序中画一个圆的简单示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值