2011年(15)
分类: 嵌入式
2011-12-19 11:39:17
嵌入式系统工具链移植的第一步是Binutils移植。Binutils是GNU的一套二进制工具集,主要包括汇编器GAS、链接器GLD、二进制查看与反汇编器Objdump等。要进行Binutils移植,主要的工作包括三部分:GAS/GLD/BFD。这里首先介绍汇编器GAS。
GAS是GNUBinutils系列二进制工具链当中的一种,主要处理的目标是以AT&T语法为主的汇编语言,并且将其汇编指令或者汇编伪指令编译生成对应合适的二进制目标文件(Object File),并交由随后的GLD进行链接和加载等处理,从而完成程序编译的最后运行。
新版本的Binutils2.20与之前的Binutils的最大不同之处在于,所有的Binutils二进制工具都基于Binutils的BFD库,而BFD库的主要功能,则是提供给Binutils的其他二进制工具使用操作不同类型文件的公共接口。因此,在最新版本的GAS中,设计者并没有亲自处理各种不同的文件,包括汇编源文件和生成目标文件,而是利用BFD库的强大功能,完成对此的操作,故而GAS更注重其内部对文件信息的处理,而目标文件的生成,则变成了对相应的BFD库中对应文件结构内容的填充,使得GAS的设计和移植工作更加容易和便捷。
汇编的整体工作流程体现在一个as.c文件的main函数里,对main分析可以了解汇编器的工作过程。在main函数中首先进行汇编器的初始化,然后读入源文件进行解析,最后把解析结果写到目标文件,具体流程如图:
读取源文件read_a_source_file函数的流程图。该函数的功能是读取源文件并且对源文件进行解析,具体如图
汇编函数perform_an_assembly_pass从命令行参数指定的源代码文件中读取源文件,解析到汇编器建立的fixup和frag结果中,对源文件只执行一遍扫描,具体流程如图