文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>头文件(二)

头文件(二)

时间:2009-07-12  来源:embededgood

14.2.2 代码注释(附件下载,pdf格式)程序14.pdf

14.2.3 a.out执行文件格式

Linux内核0.12版仅支持a.out(Assembly out)执行文件和目标文件的格式,虽然这种格式目前已经渐渐不用,而使用功能更为齐全的ELF(Executable and Link Format)格式,但是由于其简单性,作为入门的学习材料比较适用。下面全面介绍一下a.out格式。

在头文件a.out.h中声明了三个数据结构以及一些宏。这些数据结构描述了系统上目标文件的结构。在Linux 0.12系统中,编译产生的目标模块文件(简称模块文件)和链接生成的二进制可执行文件均采用a.out格式。这里统称为目标文件。一个目标文件由7部分(7节)组成。它们依次为:

(1)执行头部分(exec header)。该部分中含有一些参数(exec结构),内核使用这些参数把执行文件加载到内存中并执行,而链接程序(ld)使用这些参数将一些模块文件组合成一个可执行文件。这是目标文件唯一必要的组成部分。

(2)代码段部分(text segment)。含有程序执行时被加载到内存中的指令代码和相关数据。可以以只读形式被加载。

(3)数据段部分(data segment)。这部分含有已经初始化过的数据,总是被加载到可读写的内存中。

(4)代码重定位部分(text relocations)。这部分含有供链接程序使用的记录数据。在组合目标模块文件时用于定位代码段中的指针或地址。

(5)数据重定位部分(data relocations)。类似于代码重定位部分的作用,但是用于数据段中指针的重定位。

(6)符号表部分(symbol table)。这部分同样含有供链接程序使用的记录数据,用于在二进制目标模块文件之间对命名的变量和函数(符号)进行交叉引用。

(7)字符串表部分(string table)。该部分含有与符号名对应的字符串。

每个目标文件均以一个执行数据结构(exec structure)开始。该数据结构的形式如下:

498)this.style.width=498;" border=1>

各个字段的功能如下:

1)a_magic——该字段含有三个子字段,分别是标志字段、机器类型标识字段和魔数字段,参见图11-1。不过对于Linux 0.12系统其目标文件只使用了其中的魔数子字段,并使用宏N_MAGIC()来访问,它唯一地确定了二进制执行文件与其他加载的文件之间的区别。该子字段中必须包含以下值之一:

◆OMAGIC。表示代码和数据段紧随在执行头后面并且是连续存放的。内核将代码和数据段都加载到可读写内存中。编译器编译出的目标文件的魔数是OMAGIC(八进制0407)。

◆NMAGIC。同OMAGIC一样,代码和数据段紧随在执行头后面并且是连续存放的。然而内核将代码加载到了只读内存中,并把数据段加载到代码段后下一页可读写内存边界开始。

◆ZMAGIC。内核在必要时从二进制执行文件中加载独立的页面。执行头部、代码段和数据段都被链接程序处理成多个页面大小的块。内核加载的代码页面是只读的,而数据段的页面是可写的。链接生成的可执行文件的魔数即是ZMAGIC(0413,即0x10b)。

2)a_text——该字段含有代码段的长度值,字节数。

3)a_data——该字段含有数据段的长度值,字节数。

4)a_bss——含有bss段的长度,内核用其设置在数据段后初始的break(brk)。内核在加载程序时,这段可写内存显现出处于数据段后面,并且初始时为全零。

5)a_syms——含有符号表部分的字节长度值。

6)a_entry——含有内核将执行文件加载到内存中以后,程序执行起始点的内存地址。

7)a_trsize——该字段含有代码重定位表的大小,是字节数。

8)a_drsize——该字段含有数据重定位表的大小,是字节数。
在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)结构来描述,如下所示:

498)this.style.width=498;" border=1>

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

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结构的一个数组,如下所示:

498)this.style.width=498;" border=1>


其中各字段的含义为:

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 代码注释

498)this.style.width=498;" border=1>

相关阅读 更多 +
排行榜 更多 +
盒子小镇2游戏手机版下载

盒子小镇2游戏手机版下载

冒险解谜 下载
世界盒子模组版下载最新版本

世界盒子模组版下载最新版本

模拟经营 下载
音乐搜索app最新版本下载

音乐搜索app最新版本下载

趣味娱乐 下载