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


    微软的官方说明

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

    设置步骤

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

            2. 连接器 -> 调试

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

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

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

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

                    具体如下图:

                    

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

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

    1. demo_ccwindows
    2. Timestamp is 64eed0a8 (Wed Aug 30 13:16:24 2023)
    3. Preferred load address is 0000000140000000
    4. Start Length Name Class
    5. 0001:00000000 00003290H .text$mn CODE
    6. 0001:00003290 00000040H .text$mn$00 CODE
    7. 0001:000032d0 00000090H .text$x CODE
    8. 0002:00000000 00000240H .idata$5 DATA
    9. 0002:00000240 00000038H .00cfg DATA
    10. 0002:00000278 00000008H .CRT$XCA DATA
    11. 0002:00000280 00000008H .CRT$XCAA DATA
    12. 0002:00000288 00000008H .CRT$XCZ DATA
    13. 0002:00000290 00000008H .CRT$XIA DATA
    14. 0002:00000298 00000008H .CRT$XIAA DATA
    15. 0002:000002a0 00000008H .CRT$XIAC DATA
    16. 0002:000002a8 00000008H .CRT$XIZ DATA
    17. 0002:000002b0 00000008H .CRT$XPA DATA
    18. 0002:000002b8 00000008H .CRT$XPZ DATA
    19. 0002:000002c0 00000008H .CRT$XTA DATA
    20. 0002:000002c8 00000008H .CRT$XTZ DATA
    21. 0002:000002d0 00000000H .gehcont$y DATA
    22. 0002:000002d0 00000000H .gfids$y DATA
    23. 0002:000002d0 00000ab0H .rdata DATA
    24. 0002:00000d80 00000080H .rdata$CastGuardVftablesA DATA
    25. 0002:00000e00 00000080H .rdata$CastGuardVftablesC DATA
    26. 0002:00000e80 00000080H .rdata$voltmd DATA
    27. 0002:00000f00 00000360H .rdata$zzzdbg DATA
    28. 0002:00001260 00000008H .rtc$IAA DATA
    29. 0002:00001268 00000008H .rtc$IMZ DATA
    30. 0002:00001270 00000008H .rtc$IZZ DATA
    31. 0002:00001278 00000008H .rtc$TAA DATA
    32. 0002:00001280 00000008H .rtc$TMZ DATA
    33. 0002:00001288 00000008H .rtc$TZZ DATA
    34. 0002:00001290 0000042cH .xdata DATA
    35. 0002:000016bc 00000000H .edata DATA
    36. 0002:000016bc 0000003cH .idata$2 DATA
    37. 0002:000016f8 00000018H .idata$3 DATA
    38. 0002:00001710 00000240H .idata$4 DATA
    39. 0002:00001950 0000059eH .idata$6 DATA
    40. 0003:00000000 00020060H .data DATA
    41. 0003:00020060 00000620H .bss DATA
    42. 0004:00000000 00000468H .pdata DATA
    43. 0005:00000000 00000060H .rsrc$01 DATA
    44. 0005:00000060 00000180H .rsrc$02 DATA
    45. Address Publics by Value Rva+Base Lib:Object
    46. 0000:00000000 __AbsoluteZero 0000000000000000
    47. 0000:00000000 ___safe_se_handler_count 0000000000000000
    48. 0000:00000000 ___safe_se_handler_table 0000000000000000
    49. 0000:00000000 __arm64x_extra_rfe_table 0000000000000000
    50. 0000:00000000 __arm64x_extra_rfe_table_size 0000000000000000
    51. 0000:00000000 __arm64x_native_entrypoint 0000000000000000

            有了这些信息,之后就可以通过.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

    ...

  • 相关阅读:
    【机器学习】概率模型在机器学习中的应用:以朴素贝叶斯分类去为例
    LeetCode每日一题:1222. 可以攻击国王的皇后(2023.9.14 C++)
    没有对象怎么面向对象编程呢?这份风趣幽默的图解面向对象编程你值得拥有!
    Facebook 惊现网络钓鱼浪潮,每周攻击 10 万个账户
    go 流程控制之switch 语句介绍
    1.Zookeeper理论基础
    量化交易全流程(一)
    网络安全(黑客)自学
    C#拾遗补漏之goto跳转语句
    搭建部署属于自己的基于gpt3.5的大语言模型(基于flask+html+css+js+mysql实现)
  • 原文地址:https://blog.csdn.net/vily_lei/article/details/132580494