主要以uboot中的i386的链接脚本为例子进行说明。ELF的格式不在这里赘述。
这里有两个关键的地址:运行地址(VMA)和加载地址(LMA)。前者指的是BIOS在哪个内存地址运行;后者指的是生成的目标文件所烧结到的flash芯片所占用的系统地址是什么。
链接脚本主要描述了最终ELF中各个段是如何排布的,以及各个段的地址,一个输出段的标准格式
默认的4个段是必须有的
- .text 代码
- .rodata 常量,例如字符串什么的
- .data 初始化的全局变量
- .bss 没有初始化的全局变量
段名字后面紧跟的是 vma ,也就是这个段在程序运行的时候的地址,例如
下面实例中用了两个指令 LOADADDR ,这个指令是用来求 lma 地址的! SIZEOF 求段的大小。例如LOADADDR(.text) 求出 .text 段的 lma,SIZEOF(.text) 求出 .text 段的大小。AT(LOADADDR(.rodata) + SIZEOF(.rodata)) 指定 .data段的lma在 .text段lma的结尾处!
还有一个指令 ADDR(.text) 这个是求vma的,不是求lma。下面实例中未用到,各位知晓即可。
问题:
-------------------------------------------------------------------------------------------------------------------
1.各输入文件的.text在目标文件中.text中的位置是如何确定的?我们是否可以新增一个段,在执行正式代码前,先执行我们自定义段中的代码,如果可以,如何实现?
2. 目标文件中的各个段,何时以及如何从LMA地址迁移到VMA地址,开始正常运行的?