gcc/g++ 链接器选项“-Map”生成的“.map”文件用于什么?以及如何阅读它们?
3 回答
我建议为您投入生产的任何软件生成一个地图文件并保留一份副本。
它可用于破译崩溃报告。根据系统的不同,您可能会从崩溃中获得堆栈转储。堆栈转储将包括内存地址,其中一个寄存器将包括指令指针。这告诉你内存地址代码正在执行。在某些系统上,代码地址可以移动(在加载动态库时,因此是动态的),但低位字节应该保持不变。
映射文件是来自内存位置 -> 代码位置的 MAP。它为您提供给定内存地址处的函数名称。由于优化,它可能不是非常准确,但它为您提供了一个开始寻找导致崩溃的错误的地方。
现在,在编写商业软件的 30 年中,这是我使用地图文件的唯一目的。两次成功。
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.
...
如果你不明白这意味着什么,你可能(还)没有这个输出回答的问题,因此不需要阅读它。
编译器 gcc 是一个生成目标代码文件的程序,链接器 ld 是第二个将目标代码文件组合成可执行文件的程序。两者可以组合成一个命令行。
如果要生成要在 ARM 处理器上运行的程序,则需要使用 arm-none-eabi-gcc 和 arm-none-eabi-ld 以便代码对 ARM 架构正确。Gcc 和 ld 将为您的主机生成代码。