linker script

1. Andes SAG

http://www.andestech.com/wp-content/uploads/Andes-%E7%9A%84%E5%88%86%E6%95%A3%E8%81%9A%E5%90%88%EF%BC%88SAG%EF%BC%89%E6%9C%BA%E5%88%B6.pdf

http://www.andestech.com/wp-content/uploads/Andes-SaG-Application-Examples.pdf

linker script负责控制链接过程,链接脚本的主要目的是描述如何将输入文件中的各个部分映射到输出文件中,并控制输出文件的内存布局。控制ELF文件的加载地址和虚拟内存地址。

SAG 机制能够将加载和运行时存储器中 的代码和数据描述在一个 SAG 格式的文本描述文件中,并通过 link generator tool将SAG文件转化为标准GNU的link script文件,以供链接时使用。

1. LMA vs VMA

VMA (Virtual Memory Address) and LMA (Load Memory Address)

一般在嵌入式系统中,程序存储和运行在不同的地址空间,LMA 表示的是程序装载地址,VMA 表示的是程序运行地址,LMA 不等于 VMA 时程序在加载后不可直接运行,程序运行前,要把程序的内容,拷贝到对应的内存地址处,才能正确地运行。

可以展开的是,可执行文件一般最终被烧录至硬盘中,如Flash。而Flash并非是RAM,因此部分只读数据可以存储在Flash中,但是其他需要读写的section必须后续再加载到嵌入式系统的其他内存部分。此时Flash即为LMA,RAM即为VMA。

linker script需要定义每一个section的是否需要拷贝到RAM以及拷贝地址。

2. linker script keywords

image-20221107150334285

  • LOADADDR:获取加载地址,即Flash地址,可以理解成LMA地址
  • ADDR:获取VMA地址,即执行内存地址
  • AT:当前section的加载地址,需要从LMA地址上加载到内存中
  • location counter(LC):若不强行赋值,LC则递增

一个误区是,0x10000指的是VMA地址,而真实的LMA地址中text,data和bss是连续的。另一个理解是LMA地址连续可以使ELF文件体积更小。

3. ELF段信息

1
2
3
4
5
Sections:
Idx Name Size VMA LMA File off Algn
14 ".*_retention_data_*" 00000036 80000000 b00283a6 00028740 2**3
CONTENTS, ALLOC, LOAD, DATA

section14的header信息中表示LMA地址为b00283a6,会被加载到VMA地址80000000执行。数据段会被修改,因此不能存在于Flash中。

1
2
3
4
Sections:
Idx Name Size VMA LMA File off Algn
4 .boot 000000b2 b0000320 b0000320 00000520 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE

boot section由于只是只读的段,依然在Flash中,不需要加载。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!