不好意思 最近由于玩的太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