ld文件解析
GCC本身是一个工具集,包括预处理器、汇编器、编译器和连接器。GCC编译构建工程项目过程可拆解为:
1. 预编译(编译预处理):头文件扩展、宏扩展;
2. 汇编:将高级语言代码翻译成汇编语言代码,得到一个汇编语言的文件(xxx.s文件);
3. 编译:将上一步骤的汇编代码翻译成机器语言代码,得到模块目标文件(xxx.o文件);
4. 链接:把所有的目标模块及其各种的依赖的库链接成一个整体,得到可执行程序。
连接器的链接过程是靠链接文件(ld文件)来完成的,每一个目标模块文件中都有一个段(section)列表,目标文件的每个 section 至少包含两个信息: 名字和大小. 大部分 section 还包含与它相关联的一块数据, 称为 section contents(段内容)。
我们工程项目的链接文件名为:STM32F429ZETx_FLASH.ld。该文件是用来存放芯片内存信息的, GCC编译代码时,由该文件负责定义链接器如何将各个目标文件中的代码,组合成最终可执行程序。连接脚本的一个主要目的是描述输入文件中的段(section)如何被映射到输出文件中,并控制输出文件的内存分布。
STM32F429ZETx_FLASH.ld文件包含如下内容:
- 程序入口定义
***********************************************************************
ENTRY(Reset_Handler)
***********************************************************************
2)堆栈大小声明
***********************************************************************
_estack = 0x20030000; /* end of RAM */
_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */
***********************************************************************
3)存储器块声明
***********************************************************************
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K
}
***********************************************************************
存储器块声明在MEMORY字段。不难发现,我们工程中挑选的STM32F429ZET6单片机片内存储主要由三个部分构成:RAM、CCMRAM和和FLASH。其中RAM大小为192K;CCMRAM大小为K;FLASH大小为512K。其中RAM和CCMRAM由SRAM存储器构成,总大小为256K字节。