微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM开发各种烧写文件格式说明(ELF、HEX、BIN)

ARM开发各种烧写文件格式说明(ELF、HEX、BIN)

时间:11-11 来源:互联网 点击:

可编程的。所以排在最前面的section一定要包含有程序的入口点,否则系统无法正常运行。
2)输入段与输出端之间的对应关系。理论上,任何section,都可以被随意的映射到一个输出段中。一个.datasection是可以与一个.textsection组成输出一个.text的。当然这样的动作毫无意义。我们必须告诉linker使用那些section作为输入,产生一个输出section.
以上这两个问题,都是通过一个称为连接脚本的文件控制的。Linker通过读取连接脚本,来决定section从输入到输出的映射,设置程序的入口点,设置哪个section应该在整个可执行文件的头部等问题。
连接脚本还有另外一个作用,那就是指定每个section的地址。在section合并完成后,linker将跟据.symtab,对符号进行统一的编址,分配一个绝对的运行时地址。这个地址是以section地址作为基地址的。假设.textsection的地址是0x00000000,那么.text里面的符号将以0x00000000这个地址作为基准地址。指定section地址的工作也是由连接脚本完成。在嵌入式开发中常见的在编译工程时需指定的text_base,data_base等参数,最后会被加入到连接脚本中,从而完成section的地址分配。
以上两步完成后,linker执行引用符号重定位操作。Linker遍历.relsection(包括.reltext和.reldata),对于其中的每个数据项,根据symbol域到.symtab中查出相应的引用的真实地址(经过上面的地址分配,现在.symtab里面的符号都具有绝对的运行地址),再根据offset域提供的偏移,将这个地址填入相应的位置上。
至此,符号重定位工作全部完成。Linker删除用于保存重定位信息的rel.text和rel.datasection,加入一个segmentheader和一个.initsection。生成可执行的ELF格式的object文件。
Segmentheader保存了用于操作系统内存映射的信息。.initsection包含了一个_init的函数。程序加载时,操作系统的程序加载器通过读取segmentheader,将程序加载到用户内存空间,并根据segmentheader里面映射信息,分别将.text段和.data段映射到适当的地址上。然后再调用.init中的_init函数,完成初始化工作。
由于ELF文件具有通用性强的优点,现在流行的开发模式是,先通过编译工具生成ELF文件格式的可执行文件,在使用外部工具,抽离出ELF文件中的相应部分,生成BIN文件。例如著名的GNUbootloaderU-Boot,就采用了这种做法,编译器工具集是GCC,BIN生成工具是elf2bin。ARM公司著名的开发环境ADS,虽然使用的是自家的armcc,和armcpp编译器,但他们的工作方式却是与GNUGCC如出一辙。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top