2.4.2 表信息生成
汇编器的符号表除了记录符号的信息之外,还需要记录段相关的信息以及重定位符号的信息,这些信息都是生成可重定位目标文件所必需的。
对于段表的信息,可以在汇编器识别section语法模块时进行处理。比如声明代码段的汇编代码及段表信息生成(见图2-14)。
section .text
图2-14 段表信息生成
汇编器的语法分析器只要计算两次section声明之间的地址差,便能获得段的长度,从而将段的名称、偏移、大小记录到段表项内。如果规定段按照4字节对齐,则需要对段偏移进行扩展,如图2-14所示。
汇编器的符号表与ELF文件的符号表并非同一个概念。汇编器的符号表来源于汇编语言定义的符号,ELF文件的符号表是汇编器根据需要导出的符号信息,如图2-15所示。最明显的一个例子就是使用equ命令定义的符号,这个符号对汇编器来说是一个符号,但在ELF文件内,它就是一个数字常量,不存在符号信息。
图2-15 符号表信息生成
目标文件链接时会重新组织代码段、数据段的位置。这样段内定义的所有符号的地址以及引用符号的数据和指令都会产生偏差,这时就重新计算符号的地址,修改原来的地址,也就是常说的重定位。重定位一般分为两大类:绝对地址重定位和相对地址重定位。在重定位表内,需要记录符号重定位相关的所有信息(见图2-16)。
图2-16 重定位表信息生成