GNU链接脚本

来源:互联网 发布:太阁立志传5 mac版 编辑:程序博客网 时间:2024/05/17 04:46

    主要以uboot中的i386的链接脚本为例子进行说明。ELF的格式不在这里赘述。

    这里有两个关键的地址:运行地址(VMA)和加载地址(LMA)。前者指的是BIOS在哪个内存地址运行;后者指的是生成的目标文件所烧结到的flash芯片所占用的系统地址是什么。

    链接脚本主要描述了最终ELF中各个段是如何排布的,以及各个段的地址,一个输出段的标准格式
     

   section_name 根据ld手册说是有个确定的名字,其他没啥,自己添加一些新段也是可以的。
   默认的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地址,开始正常运行的?

原创粉丝点击