GNU链接语法
1. 脚本格式
链接脚本是由若干条命令组成,每个命令是由关键字组成
/ * */ 里面放的是注释信息。
2. 对STM32链接文件进行简单分析
/* Entry Point */
/* 入口地址 */
ENTRY(Reset_Handler)
/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */
_Min_Heap_Size = 0x200 ; /* required amount of heap */
_Min_Stack_Size = 0x400 ; /* required amount of stack */
/* Memories definition */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K
}
/* Sections */
SECTIONS
{
/* The startup code into "FLASH" Rom type memory */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH
}
可以简单分析出:
- 程序启动地址是Reset_Handler。
- 内存分一个空间,起始位置: 0x20000000 长度: 64K
- FLASH分一个空间,起始地址: 0x08000000 长度: 512K
3. 命令介绍
- ENTRY(SYMBOL); SYMBOL可以是一个符号,或者是一个地址。
选择可执行文件的入口地址,该地址可以由以下方式指定:
- 使用gnu-ld命令行的-e选项,后跟入口地址
- 脚本的ENTRY命令
- 如果定义了start符号,则可以使用start符号值。这个可能和实际链接器有关系。
- 使用.text section的开始地址
- 使用0
优先级顺序,1最高,5最低
- INCLUDE(file) 包含名为file的链接文件,搜索路径按照默认配置路径
和C代码的#include类似,可以在需要的位置,包含另一个外部链接脚本。搜索路径需要由-L指定。脚本的嵌套使用最高支持10层,超过之后可能会有问题。 - INPUT(files) 将files作为输入文件。参加链接过程
首先会在当前路径下,搜索该文件,如果没有找到,则会去-L的指定路径下,进行查找。如果出现在多个脚本,则回按照执行顺序进行链接。 - GROUP(file) 指定要重复搜索符号定义的多个输入文件。