什么是gcc链接器映射文件用于?

时间:2014-03-05 13:57:50

标签: gcc linker g++ linker-flags

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

3 个答案:

答案 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将为您的主机生成代码。