这里介绍一下一般使用的link文件,不同公司的编译器或芯片可能会有所不同,不过大致的流程应该类似。:
纪念下uzi
1. Firstblood :
程序代码最终生成可执行文件经历了几个阶段:预编译、编译(C—>汇编—>binary)、链接。
编译只是把各个.c和.s文件编译成对应的.o文件。然后需要链接器将各个.o文件链接为一个可执行文件。
2.Doublekill :
有几个链接文件的关键词 需要知道:
.text:是程序代码段,用于存放函数代码
.data: 全局变量并且初始值不为0
.bss:未初始化的全局变量或者初始化为0的全局变量。
3. Triple kill:
编译器将.c、.s文件编译成了对应的.o文件,每个.o文件中可能包含了数量不同的段,.text段、.data段、.bss段、.vectors段、.ram_code段。有的.o文件可能只有其中的一部分,有的.o文件可能包含了所有这些段。链接器将各个.o文件中的代码按照不同的段,链接成一个文件。所有的.text链接到一起,所有的.data链接到一起,所有的.bss段链接到一起,所有的.vectors段链接到一起,所有的.ram_code段链接到一起。
4. Quadra kill
其中:
ENTRY(__start) //告诉链接器程序的启动地址,__start在.s中定义。
SECTION //
{
}
*是通配符.是一个特殊符号,该符号是一个定位计数器。表示当前地址,可被赋值而改变。
PROVIDE:其他文件中可以调用PROVIDE定义的变量。(详细的解释可以百度或google)
5,Penta kill
AT:实现LMA和VMA不一致的功能。AT表示在LMA中的存放地址,而在VMA中则按照普通方式存放。
比如AT ( _dstored_ ),在bin文件中不需要这部分地址。所以使用了AT命令。
PROVIDE(_code_size_ = (. + 15 ) / 16); //16bytes 对齐
主要实现数据对齐。
ACE