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