更新时间: 2023-01-14
1VIVI的编译与链接
编泽器对程序的处理要经过预编译阶段、编译阶段、汇编阶段及链接阶段,每个目标文件都有一系列段(section),输入文件的段(section)称为输入段(inputsection).输出文件的段(section)则称为输出段(outputsection)。在VIVI的链接过程中,用到了一个链接脚本文件,它描述了各个输入文件的各个段(section)如何映射到输出文件的各个(section)中,并控制输出文件中secrion和符号的内存布局,此内存布局决定了VlVI的运行时域。在此阶段,链接器LD利用链接脚本把各种目标文件和库文件链接起来,并重定向它们的数据,完成符号解析,**把所有的目标文件链接成为一个可执行的目标文件,即为可烧写到Flash中的VIVI映像。针对本系统开发板的VIVI链接脚本对原链脚本进行了改进,添加了第<6>行,下文的论述会用到此处的变量viviend。
<1>SECTI**{
<2>.=033f00000;
<3>.text:{*(.text)}
<4>.dataALlGN(4):{*(.data)}
<5>.bssALIGN(4):{*(.bss)*(COMMON)}
<6>vivi_end=.:
<7>}
其中:SECTI**表示段。第<2>行表示当前地址为033f00000,它是text段的起始地址,也是运行时域的起始地址。第<3>行用了通配符*表示所有字符,这里的意思就是说**的每个目标文件的textsection的内容都放到同一个.text中。第<4>行表示**的每个目标文件的datasection的内容都放到问一个.data中,而且要四字节对齐。每<5>行表示**的每个目标文件的bsssection的内容都放到同一个.bss中,所有的普通符号都放到COMMON中,也要四字节对齐。第<6>行是把当前地址赋值给变量vivi_end,它也是运行时域的末地址。