Skip to content

链接脚本LinkerScript

· 4 min · STM32 / 嵌入式开发 / GCC / 学习笔记

链接脚本的作用#

在嵌入式开发中,需要指定不同的段烧录到单片机的地址,这个过程由链接脚本指定。

一般来说链接脚本根据芯片的不同,设定不同的RAM和FLASH起始地址和长度。

除了指示链接的过程,还可以将地址变成变量,传递给启动文件,例如bss段和data段的起始位置和结束位置,能够让启动文件从flash中搬运data段到RAM中,以及初始化bss段的数据为0。

链接脚本和段#

现在想象有一个RAM,知道其起始地址和长度,有一个FLASH,也知道其起始地址和长度。

那么链接脚本会将

定位到FLASH的位置,尤其是中断向量表一定会被放在FLASH的起始位置,而且中断向量表的第一个位置一定是主栈指针,其实也就是RAM的结束位置。

并且将

这样就得到了RAM的内存布局。那堆和栈呢?编译器并不知道程序需要使用多少堆,只能通过编译知道栈的深度。

链接脚本中设置了Min_Heap_Size和Min_Stack_Size两个变量,并且在bss段后面创建了这样的一个用户堆栈段,其作用就是剩下的内存是否能满足最小栈和最小堆的使用。

也就是说RAM中可以动态使用的内存就是在bss后面。

基本语法#

MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K
FLASH (rx) : ORIGIN = 0x80000000, LENGTH = 512K
}

使用MEMORY定义RAM和FLASH。

SECTIONS
{
.text:
{
. = ALIGN(4)
*(.text)
. = ALIGN(4)
PROVIDE(etext = .)
}>FLASH
}

源文件和链接文件#

链接文件很多时候可以向源文件提供一些变量。

比如在stm32的链接脚本中提供了data段的起始地址结束地址,还有bss段的起始地址还有结束地址。

在这里就可以实现将所有剩余的RAM纳入动态内存的管理,以实现操作系统的动态内存管理。