1. ARM链接器基础架构解析
在嵌入式系统开发中,链接器扮演着将编译后的目标文件转化为可执行映像的关键角色。ARM链接器(armlink)通过独特的段(Section)管理机制,实现了对代码和数据的精细控制。理解其工作原理是开发高效嵌入式系统的前提。
1.1 映像构建的三层结构
ARM映像采用层次化组织结构,从微观到宏观可分为:
-
输入段(Input Section):编译器生成的最小单元,包含代码或数据。具有RO(只读)、RW(读写)、ZI(零初始化)三种核心属性。例如在Keil MDK中,通过
#pragma section="CORE_RO_CODE"可自定义段属性。 -
输出段(Output Section):由同属性输入段合并而成的连续内存块。典型的三种输出段:
c复制const int table[] = {1,2,3}; // 归属RO输出段 int buffer[256]; // 未初始化时归ZI段,初始化后归RW段 -
区域(Region):1-3个输出段的逻辑容器,对应物理存储设备(如Flash、SRAM)。在分散加载文件中,典型的region定义如下:
scatter复制ROM_LOAD 0x00000000 0x00200000 { EXEC_ROM 0x00000000 0x00200000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RAM_EXEC 0x10000000 0x00010000 { .ANY (+RW +ZI) } }
1.2 双视图内存模型
ARM链接器创新性地引入两种内存视角:
-
加载视图(Load View):映像在非易失性存储器中的初始布局。此时ZI段仅存在描述信息,实际不占空间。例如在NOR Flash中:
code复制| RO段 | RW段 | (ZI段描述) | -
执行视图(Execution View):系统运行时经过重定位后的内存映射。典型ROM+RAM系统中:
``
