Disc

博客园 首页 新随笔 联系 订阅 管理

不好意思  最近由于玩的太happy了 一直没能抽更多时间系统的学习ELF   以后争取一天一篇吧。。尽量 最起码 每天都看点

1.  ELF文件格式及程序加载执行过程总汇  http://www.linuxsir.org/bbs/printthread.php?t=206356 (个人感觉这个写的比较全了)

2.  前面主要还是讲ELF的文件格式  各部分的含义。。这东西应该是理解ELF的基础 不再多讲  今天主要看的是重定位

    重定位是连接符号引用和符号定义的过程。比如,当一个程序调用一个函数的时候, 
相关的调用必须在执行时把控制传送到正确的目标地址。换句话说,重定位文件应当 
包含有如何修改他们的 section 内容的信息,从而允许可执行文件或共享目标文件 
为一个进程的程序映像保存正确的信息。重定位入口就是这样的数据。 

+ Figure 1-20: Relocation Entries 

typedef struct { 
Elf32_Addr r_offset; 
Elf32_Word r_info; 
} Elf32_Rel; 

typedef struct { 
Elf32_Addr r_offset; 
Elf32_Word r_info; 
Elf32_Sword r_addend; 
} Elf32_Rela; 

一个重定位 section 关联了两个其他的 section :一个符号表和一个可修改的 section 。该 section 头的成员 sh_info 和 sh_link (在上文中的 

“ section ”部分中有描述)指示了这种关系。重定位入口中的成员 r_offset 对于不同的目标文件有少许差异。 * 在可重定位文件中,r_offset 表示了一个 section 偏移。

也就是说,重定位 section自己描述了如何修改其他在文件中的其他section; 重定位偏移量指明了一个在第二个section中的存储器单元。 

* 在可执行和共享的目标文件中,r_offset 表示一个虚拟地址。为了使得这些 文件的重定位入口更为有用(对于动态链接器而言),该 section 偏移(文件 
中)应当让位于一个虚拟地址(内存中的)。 尽管为了允许相关的程序更为有效的访问而让 r_offset 的解释对于不同的目标 文件有所不同,重定位类型的含义是相同的。 

3. 查阅了重定位的流程:

* A 

表示用于计算可重定位的域值的加数。 

* B 

表示了在执行过程中一个共享目标被加载到内存时的基地址。一般情况下,一个 
共享object文件使用的基虚地址为0,但是一个可执行地址就跟共享object文件 
不同了。 

* G 

表示了在执行过程中重定位入口符号驻留在全局偏移表中的偏移。请参阅 
第二部分中的“ Global Offset Table (全局偏移表)”获得更多 
的信息。 

* GOT 

表示了全局偏移表的地址。请参阅第二部分中的“ Global Offset Table 
(全局偏移表)”获得更多的信息。 

* L 

表示一个符号的过程链接表入口的位置( section 偏移或地址)。一个过程 
链接表入口重定位一个函数调用到正确的目的单元。链接器创建初始的链接表, 
而动态链接器在执行中修改入口。 
请参阅第二部分中的“ Procedure Linkage Table (过程链接表)”获得更多 
的信息 

* P 

表示(section 偏移或地址)被重定位的存储单元位置(使用 r_offset 计算的)。 

* S 

表示索引驻留在重定位入口处的符号值。 

一个重定位入口的 r_offset 值指定了受影响的存储单元的首字节的偏移 
或虚拟地址。重定位类型指定了哪一位(bit)将要改变,以及怎样计算它们的值。 
在 SYSTEM V 体系中仅仅使用 Elf32_Rel 重定位入口,将要被重定位的域中 
保留了加数。在所有的情况下,加数和计算结果使用相同字节顺序。 

+ Figure 1-22(表 1-22): Relocation Types(重定位类型) 

Name Value Field Calculation 
==== ===== ===== =========== 
R_386_NONE 0 none none 
R_386_32 1 word32 S + A 
R_386_PC32 2 word32 S + A - P 
R_386_GOT32 3 word32 G + A - P 
R_386_PLT32 4 word32 L + A - P 
R_386_COPY 5 none none 
R_386_GLOB_DAT 6 word32 S 
R_386_JMP_SLOT 7 word32 S 
R_386_RELATIVE 8 word32 B + A 
R_386_GOTOFF 9 word32 S + A - GOT 
R_386_GOTPC 10 word32 GOT + A - P 

posted on 2011-03-21 21:35  Disc  阅读(209)  评论(0编辑  收藏  举报