手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

elf文档格式-- 2

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


* R_386_RELATIVE

链接器创建该重定位类型用于动态链接。其偏移成员给出了包含表达相关地址值
的一个 shared object 中的位置。动态链接器计算相应的虚拟地址(把该
shared object 装载地址和相对地址相加)。该类型的重定位入口必须为
符号表索引指定为 0 。


* R_386_GOTOFF

这种重定位类型计算符号值和全局偏移表地址之间的不同。另外还通知链接器
建立全局偏移表(GOT)。



* R_386_GOTPC

这种重定位类型类似于 R_386_PC32 ,不同的是他在计算中使用全局偏移表。
这种重定位中引用的符号通常是 _GLOBAL_OFFSET_TABLE_ ,该符号通知了
链接器建立全局偏移表(GOT)。

________________________________________________________________


2. PROGRAM LOADING AND DYNAMIC LINKING
程式装入和动态链接
________________________________________________________________


======================== Introduction(介绍) =========================


第二部分描述了 object file 信息和创建运行程式的系统行为。其中部分信息
适合任何的系统,其他信息是和特定处理器相关的。


可执行和共享的 object file 静态的描绘了程式。为了执行这样的程式,系统
用这些文档创建动态的程式表现,或进程映像。一个进程映像有用于保存其代码、
数据、堆栈等等的段。这个部分的主要章节讨论如下的内容。


* 程式头(Program header)。该章节补充第一部分,描述和程式运行相关的
object file 结构。即文档中主要的数据结构、程式头表、定位段映像,也
包含了为该程式创建内存映像所需要的信息。

* 载入程式(Program loading)。在给定一个 object file 时,系统为了
让他运行必须将他载入内存。

* 动态链接(Dynamic linking)。在载入了程式之后,系统必须通过解决组
成该进程的 object file之间的符号引用问题来完成进程映像的过程。

注意:指定了处理器范围的 ELF 常量是有命名约定的。比如,DT_ , PT_ ,
用于特定处理器扩展名,组合了处理器的名称(如 DT_M32_SPECIAL )。
没有使用这种约定但是预先存在的处理器扩展名是允许的。


Pre-existing Extensions
(预先存在的扩展名)
=======================
DT_JMP_REL


====================== Program Header(程式头) ======================


一个可执行的或共享的 object file 的程式头表是个结构数组,每一个
结构描述一个段或其他系统准备执行该程式所需要的信息。一个 object file
段包含一个或多个部分(就象下面的“段目录”所描述的那样)。程式头仅仅对于
可执行或共享的 object file 有意义。一个文档使用 ELF 头的 e_phentsize
和 e_phnum 成员来指定其拥有的程式头大小。[参阅 第一部分中的 "ELF 头"]


Figure 2-1: Program Header

typedef struct {
Elf32_Word p_type;
Elf32_Off p_offset;
Elf32_Addr p_vaddr;
Elf32_Addr p_paddr;
Elf32_Word p_filesz;
Elf32_Word p_memsz;
Elf32_Word p_flags;
Elf32_Word p_align;
} Elf32_Phdr;

* p_type

该成员指出了这个数组的元素描述了什么类型的段,或怎样解释该数组元素的信息。
类型值和含义如下所述。

* p_offset

该成员给出了该段的驻留位置相对于文档开始处的偏移。

* p_vaddr

该成员给出了该段在内存中的首字节地址。

* p_paddr

在物理地址定位有关联的系统中,该成员是为该段的物理地址而保留的。由于
System V 忽略了应用程式的物理地址定位,该成员对于可执行文档和共享的
object 而言是未指定内容的。


* p_filesz

该成员给出了文档映像中该段的字节数;他可能是 0 。

* p_memsz

该成员给出了内存映像中该段的字节数;他可能是 0 。

* p_flags

该成员给出了和该段相关的标志。定义的标志值如下所述。

* p_align

就象在后面“载入程式”部分中所说的那样,可载入的进程段必须有合适的
p_vaddr 、 p_offset 值,取页面大小的模。该成员给出了该段在内存和
文档中排列值。 0 和 1 表示无需排列。否则, p_align 必须为正的 2 的幂,
并且 p_vaddr 应当等于 p_offset 模 p_align 。


某些入口描述了进程段;其他的则提供补充信息并且无益于进程映像。已
定义的入口能够以任何顺序出现,除非是下面明确声明的。后面是段类型值;
其他的值保留以便将来用于其他用途。


Figure 2-2: Segment Types, p_type

Name Value
==== =====
PT_NULL 0
PT_LOAD 1
PT_DYNAMIC 2
PT_INTERP 3
PT_NOTE 4
PT_SHLIB 5
PT_PHDR 6
PT_LOPROC 0x70000000
PT_HIPROC 0x7fffffff

* PT_NULL

该数组元素未使用;其他的成员值是未定义的。这种类型让程式头表忽略入口。

* PT_LOAD

该数组元素指定一个可载入的段,由 p_filesz 和 p_memsz 描述。文档中
字节被映射到内存段中。假如该段的内存大小( p_memsz )比文档大小( p_filesz )
要大,则多出的字节将象段初始化区域那样保持为 0 。文档的大小不会比内存大小值大。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!