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

elf文档格式-- 3

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

ABI-conforming的。

* DT_TEXTREL

如在程式头表中段许可所指出的那样,这个成员的缺乏代表没有重置入
口会引起非写段的修改。假如该成员存在,一个或多个重定位入口可能
请求修改一个非写段,并且动态连接器能因此有准备。


* DT_JMPREL

假如存在,他的入口d_ptr成员保存着重定位入口(该入口单独关联着
PLT)的地址。假如lazy方式打开,那么分离他们的重定位入口让动态连接
器在进程初始化时忽略他们。假如该入口存在,相关联的类型入口DT_PLTRELSZ
和DT_PLTREL一定要存在。

* DT_LOPROC through DT_HIPROC

在该范围内的变量为特别的处理器语义保留。除了在数组末尾的DT_NULL元素,
和DT_NEEDED元素相关的次序,入口可能出现在任何次序中。在表中不出
现的Tag值是保留的。


Shared Object Dependencies(共享Object的依赖关系)

当连接器处理一个文档库时,他取出库中成员并且把他们拷贝到一个输出的
object文档中。当运行时没有包括一个动态连接器的时候,那些静态的连接服
务是可用的。共享object也提供服务,动态连接器必须把正确的共享object
文档连接到要实行的进程映象中。因此,可执行文档和共享的object文档之间
存在着明确的依赖性。

当动态连接器为一个object文档创建内存段时,依赖关系(在动态结构的
DT_NEEDED入口中记录)表明需要哪些object来为程式提供服务。通过
重复的连接参考的共享object和他们的依赖关系,动态连接器能够建造一个
完全的进程映象。当解决一个符号引用的时候,动态连接器以宽度优先搜索
(breadth-first)来检查符号表,换句话说,他先查看自己的可实行程式
中的符号表,然后是顶端DT_NEEDED入口(按顺序)的符号表,再接下来是
第二级的DT_NEEDED入口,依次类推。共享object文档必须对进程是可读的;
其他权限是无需的。

注意:即使当一个共享object被引用多次(在依赖列关系表中),动态连接器
只把他连接到进程中一次。

在依赖关系列表中的名字既被DT_SONAME字符串拷贝,又被建立object文档
时的路径名拷贝。例如,动态连接器建立一个可执行文档(使用带DT_SONAME
入口的lib1共享文档)和一个路径名为/usr/lib/lib2的共享object库,
那么可执行文档将在他自己的依赖关系列表中包含lib1和/usr/bin/lib2。

假如一个共享object名字有一个或更多的反斜杠字符(/)在这名字的如何地方,
例如上面的/usr/lib/lib2文档或目录,动态连接器把那个字符串自己做为路径名。
假如名字没有反斜杠字符(/),例如上面的lib1,三种方法指定共享文档的
搜索路径,如下:

* 第一,动态数组标记DT_RPATH保存着目录列表的字符串(用冒号(:)分隔)。
例如,字符串/home/dir/lib:/home/dir2/lib:告诉动态连接器先搜索
/home/dir/lib,再搜索/home/dir2/lib,再是当前目录。

* 第二,在进程环境中(see exec(BA_OS)),有一个变量称为LD_LIBRARY_PATH
能够保存象上面相同的目录列表(随意跟一个分号(;)和其他目录列表)。
以下变量等于前面的例子:
LD_LIBRARY_PATH=/home/dir/lib:/home/dir2/lib:
LD_LIBRARY_PATH=/home/dir/lib;/home/dir2/lib:
LD_LIBRARY_PATH=/home/dir/lib:/home/dir2/lib:;
所以的LD_LIBRARY_PATH目录在DT_RPATH指向的目录之后被搜索。尽管一些
程式(例如连接编辑器)不同的处理分号前和分号后的目录,但是动态连接
不会。但是,动态连接器接受分号符号,具体语意在如上面描述。

* 最后,假如上面的两个目录查找想要得到的库失败,那么动态连接器搜索
/usr/lib.

注意:出于安全考虑,动态连接器忽略set-user和set-group的程式的
LD_LIBRARY_PATH所指定的搜索目录。但他会搜索DT_RPATH指明的目录和
/usr/lib。


Global Offset Table(GOT全局偏移量表)

一般情况下,位置无关的代码不包含绝对的虚拟地址。全局偏移量表在私有数据
中保存着绝对地址,所以应该使地址可用的,而不是和位置无关性和程式代码段
共享能力妥协。一个程式引用他的GOT(全局偏移量表)来使用位置无关的地址并且
提取绝对的变量,所以重定位位置无关的参考到绝对的位置。

初始时,GOT(全局偏移量表)保存着他重定位入口所需要的信息 [看第一部分的
“Relocation”]。在系统为一个可装载的object文档创建内存段以后,动态
连接器处理重定位入口,那些类型为R_386_GLOB_DAT的指明了GOT(全局偏移量表)。
动态连接器决定了相关的标号变量,计算他们的绝对地址,并且配置适当的内存
表入口到正确的变量。虽然当连接编辑器建造object文档的时候,绝对地址
是不知道,连接器知道所以内存段的地址并且能够因此计算出包含在那里的
标号地址。

假如程式需要直接访问符号的绝对地址,那么这个符号将有一个GOT(全局偏移量表)
入口。因为可执行文档和共享文档有单独的GOT(全局偏移量表),一个符号地址
可能出现在不同的几个表中。在交给进程映象的代码控制权以前,动态连接器处
理任何的重定位的GOT(全局偏移量表),所以在执行时,确认绝对地址是可用的。

该表的入口0是为保存动态结构地址保留的(参考_DYNAMIC标号)。这允许
象动态连接程式那样来找出他们自己的动态结构(还没有处理他们的重
定向入口)。这些对于动态连接器是重要的,因为他必要初始化自己而不
能依赖于其他程式来重定位他们的内存映象。在32位Interl系统结构中,在
GOT中的人口1和2也是保留的,具体看以下的过程连接表(Procedure Linkage
Table)。

系统能够为在不同的程式中相同的共享object选择不同的内存段;他甚至能够
为相同的程式不同的进程选择不同的库地址。虽然如此,一旦进程映象被建立
以后,内存段不改变地址。只要一个进程存在,他的内存段驻留在固定的虚拟

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