生成可执行文件的主要流程:预编译、编译(C—>汇编—>binary)、链接。
编译只是把各个.c和.s文件编译成对应的.o文件。然后需要链接器将各个.o文件链接为一个可执行文件。
.lsl,.ld文件:属于一种linkfile,规定如何把输入文件内的section放到输出文件,以及控制输出文件内各部分在程序地址空间内的布局。
.text:是程序代码段,用于存放函数代码
.data: 全局变量并且初始值不为0
.bss:未初始化的全局变量或者初始化为0的全局变量。
标准C语言的 section 前缀主要包括: .bss/.data/.rodata/.text。
英飞凌芯片对应的将数据划分为 near类型/far类型。对应的前缀为:
1)带 “z”的near类型数据:.zbss/.zdata/.zrodata
2)标准的 far 类型数据: .bss/.data/.rodata
16位系统中会有近指针,远指针。
near定义的标号表示段内近跳转,近调用的地址。near指针的长度是16位的,所以可指向的地址范围是64K字节,通常说near指针的寻址范围是64K。
far定义的标号表示段间远跳转,远调用的地址。far指针的长度是32位,含有一个16位的基地址和16位的偏移量,将基地址乘以16后再与偏移量相加,实际上far指针是20位,取值范围为0x00000~0xFFFFF。所以far指针的寻址范围是1M字节,超过了一个段64K的容量。
编译器将.c文件编译成了对应的.o文件后,每个.o文件中会包含了数量不同的段,.text段、.data段、.bss段、.vectors段、.ram_code段。链接器将各个.o文件中的代码按照不同的段,链接成一个文件。所有的.text链接到一起,所有的.data链接到一起,所有的.bss段链接到一起,所有的.vectors段链接到一起,所有的.ram_code段链接到一起。
ENTRY(_START) ,ENTRY语法说明,用户程序最先从START处开始运行,定义应用程序的入口点,相当于告诉连接器的启动地址,即输出文件中的第一条可执行指令,_START一般在.s文件定义。
Flash地址分配可以用链接脚本来控制,代码共分为三个部分,Tricore的APP,HSM的BootLoader和HSM的APP,三个工程的链接脚本要相互配合好,这样编译出来的代码不会互相覆盖。
例子:
代码内声明为Static类型的变量,其运行空间在RAM区域加载空间在ROM区域,编译后属性为.data/.bss,其运行空间可通过以下方式设定去运行地址与加载地址。
设定运行地址
group P_REW_DIS_TSK2MS (ordered, align = 4, run_addr=P_REW_DIS_TSK2MS_ORG)
{
section "P_REW_DIS_TSK2MS" (size=P_REW_DIS_TSK2MS_LEN, attributes=r, fill=0x00)
{
select ".text.*.P_REW_DIS_TSK2MS.text";
}
}
设定加载地址
group P_REW_EXE_EXD (ordered, contiguous, align=4, fill=0, load_addr=P_REW_EXE_EXD_ORG)
{
group (ordered, contiguous, align=4)
{
section "P_REW_EXE_EXD" (size=P_REW_EXE_EXD_LEN, attributes=r, fill=0x00)
{
select ".text.*.P_REW_EXE_EXD.text";
}
}
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_43925467/article/details/135132702
|