12

gcc/g++ 链接器选项“-Map”生成的“.map”文件用于什么?以及如何阅读它们?

4

3 回答 3

14

我建议为您投入生产的任何软件生成一个地图文件并保留一份副本。

它可用于破译崩溃报告。根据系统的不同,您可能会从崩溃中获得堆栈转储。堆栈转储将包括内存地址,其中一个寄存器将包括指令指针。这告诉你内存地址代码正在执行。在某些系统上,代码地址可以移动(在加载动态库时,因此是动态的),但低位字节应该保持不变。

映射文件是来自内存位置 -> 代码位置的 MAP。它为您提供给定内存地址处的函数名称。由于优化,它可能不是非常准确,但它为您提供了一个开始寻找导致崩溃的错误的地方。

现在,在编写商业软件的 30 年中,这是我使用地图文件的唯一目的。两次成功。

于 2016-04-20T06:51:51.780 回答
4

gcc/g++ 链接器选项“-Map”生成的“.map”文件有什么用途?

没有“gcc 链接器”之类的东西——GCC 和链接器是独立且独立的项目。

通常地图用于理解ld链接二进制文件时所做的决策。来自man ld

-M
   --print-map
       Print a link map to the standard output.
       A link map provides information about the link, including the following:
       ·   Where object files are mapped into memory.
       ·   How common symbols are allocated.
       ·   All archive members included in the link, with a mention of the symbol which caused the archive member to be brought in.
       ·   The values assigned to symbols.
       ...

如果你不明白这意味着什么,你可能(还)没有这个输出回答的问题,因此不需要阅读它。

于 2014-03-06T06:40:11.907 回答
0

编译器 gcc 是一个生成目标代码文件的程序,链接器 ld 是第二个将目标代码文件组合成可执行文件的程序。两者可以组合成一个命令行。

如果要生成要在 ARM 处理器上运行的程序,则需要使用 arm-none-eabi-gcc 和 arm-none-eabi-ld 以便代码对 ARM 架构正确。Gcc 和 ld 将为您的主机生成代码。

于 2019-08-12T22:25:23.887 回答