在a.out.h头文件中定义了几个宏,这些宏使用exec结构来测试一致性或者定位执行文件中各个部分(节)的位置偏移值。这些宏有:

◆N_BADMAG(exec)。如果a_magic字段不能被识别,则返回非零值。

◆N_TXTOFF(exec)。代码段的起始位置字节偏移值。

◆N_DATOFF(exec)。数据段的起始位置字节偏移值。

◆N_DRELOFF(exec)。数据重定位表的起始位置字节偏移值。

◆N_TRELOFF(exec)。代码重定位表的起始位置字节偏移值。

◆N_SYMOFF(exec)。符号表的起始位置字节偏移值。

◆N_STROFF(exec)。字符串表的起始位置字节偏移值。

重定位记录具有标准的格式,它使用重定位信息(relocation_info)结构来描述,如下所示:

Linux内核完全剖析---头文件

该结构中各字段的含义如下:

1)r_address——该字段含有需要链接程序处理(编辑)的指针的字节偏移值。代码重定位的偏移值是从代码段开始处计数的,数据重定位的偏移值是从数据段开始处计算的。链接程序会将已经存储在该偏移处的值与使用重定位记录计算出的新值相加。

2)r_symbolnum——该字段含有符号表中一个符号结构的序号值(不是字节偏移值)。链接程序在算出符号的绝对地址以后,就将该地址加到正在进行重定位的指针上。(如果r_extern比特位是0,那么情况就不同,见下面。)

3)r_pcrel——如果设置了该位,链接程序就认为正在更新一个指针,该指针使用pc相关寻址方式,是属于机器码指令部分。当运行程序使用这个被重定位的指针时,该指针的地址被隐式地加到该指针上。

4)r_length——该字段含有指针长度的2的次方值:0表示1字节长,1表示2字节长,2表示4字节长。

5)r_extern——如果被置位,表示该重定位需要一个外部引用;此时链接程序必须使用一个符号地址来更新相应指针。当该位是0时,则重定位是“局部”的。链接程序更新指针以反映各个段加载地址中的变化,而不是反映一个符号值的变化。在这种情况下,r_symbolnum字段的内容是一个n_type值;这类字段告诉链接程序被重定位的指针指向那个段。

6)r_pad——Linux系统中没有使用的4个比特位。在写一个目标文件时最好全置0。

符号将名称映射为地址(或者更通俗地讲是字符串映射到值)。由于链接程序对地址的调整,一个符号的名称必须用来表示其地址,直到已被赋予一个绝对地址值。符号是由符号表中固定长度的记录以及字符串表中的可变长度名称组成。符号表是nlist结构的一个数组,如下所示:

Linux内核完全剖析---头文件


其中各字段的含义为:

1)n_un.n_strx——含有本符号的名称在字符串表中的字节偏移值。当程序使用nlist()函数访问一个符号表时,该字段被替换为n_un.n_name字段,这是内存中字符串的指针。

2)n_type——用于链接程序确定如何更新符号的值。使用第146~154行开始的位屏蔽(bitmasks)码可以将8比特宽度的n_type字段分割成三个子字段,如图14-2所示。对于N_EXT类型位置位的符号,链接程序将它们看作是“外部的”符号,并且允许其他二进制目标文件对它们的引用。N_TYPE屏蔽码用于链接程序感兴趣的比特位:

◆N_UNDF。一个未定义的符号。链接程序必须在其他二进制目标文件中定位一个具有相同名称的外部符号,以确定该符号的绝对数据值。特殊情况下,如果n_type字段是非零值,并且没有二进制文件定义了这个符号,则链接程序在BSS段中将该符号解析为一个地址,保留长度等于n_value的字节。如果符号在多于一个二进制目标文件中都没有定义并且这些二进制目标文件对其长度值不一致,则链接程序将选择所有二进制目标文件中最大的长度。

◆N_ABS。一个绝对符号。链接程序不会更新一个绝对符号。

◆N_TEXT。一个代码符号。该符号的值是代码地址,链接程序在合并二进制目标文件时会更新其值。

◆N_DATA。一个数据符号。与N_TEXT类似,但是用于数据地址。对应代码和数据符号的值不是文件的偏移值而是地址;为了找出文件的偏移,就有必要确定相关部分开始加载的地址并减去它,然后加上该部分的偏移。

◆N_BSS。一个BSS符号。与代码或数据符号类似,但在二进制目标文件中没有对应的偏移。

◆N_FN。一个文件名符号。在合并二进制目标文件时,链接程序会将该符号插入在二进制文件中的符号之前。符号的名称就是给予链接程序的文件名,而其值是二进制文件中首个代码段地址。链接和加载时不需要文件名符号,但对于调式程序非常有用。

◆N_STAB。屏蔽码用于选择符号调式程序(例如gdb)感兴趣的位。其值在stab()中说明。

3)n_other——该字段按照n_type确定的段,提供有关符号重定位操作的符号独立性信息。目前,n_other字段的最低4位含有两个值之一:AUX_FUNC和AUX_OBJECT(有关定义参见)。AUX_FUNC将符号与可调用的函数相关,AUX_OBJECT将符号与数据相关,无论它们是位于代码段还是数据段。该字段主要用于链接程序ld,用于动态可执行程序的创建。

4)n_desc——保留给调式程序使用;链接程序不对其进行处理。不同的调试程序将该字段用作不同的用途。

5)n_value——含有符号的值。对于代码、数据和BSS符号,这是一个地址;对于其他符号(例如调式程序符号),值可以是任意的。

字符串表由长度为unsigned long后跟一null结尾的符号字符串组成。长度代表整个表的字节大小,所以在32位的机器上其最小值(即第1个字符串的偏移)总是4。

14.3 const.h文件

14.3.1 功能描述

该文件定义了i节点中文件属性和类型i_mode字段所用到的一些标志位常量符号。

14.3.2 代码注释

Linux内核完全剖析---头文件



相关内容