ELF动态解析符号过程
上一篇 / 下一篇 2008-01-30 15:03:12 / 个人分类:Linux下C语言
本篇文章以linux为平台为例,演示ELF动态解析符号的过程。
t(re'D!_.O0不正之处,还请斧正。Linux宝库[S1`]Z
通常,ELF解析符号方式称为lazy MODE装载的。这种装载技术是ELF平台上
#Fod'krM0默认的方式。在不同的体系平台在实现这种机制也是不同的。但是i386和SPARC
8P5Yiz#o7OSk9V0在大部分上是相同的。Linux宝库t3|DA%B(HK
A
动态连接器(rtld)提供符号的动态连接,装载共享objects和解析标号的引用。
&pe+SmtzP
R0通常是ld.so,它可以是一个共享object也可以是个可执行的文件。Linux宝库f"k*nM!B ^
v}A;zjy4j`T|0
-lfx"{ k8]c Xx0★★ 符号表(symbol table)Linux宝库"{9`&|(Lt
每个object要想使它对其他的ELF文件可用,就要用到符号表(symbol table)中
2G5l Hr;r`0symbol entry.事实上,一个symbol entry 是个symbol结构,它描述了这个Linux宝库U^8e7OMR
symbol的名字和该symbol的value.symbol name被编码作为dynamic stringLinux宝库1]S9j'})g#XPv[
table的索引(index). The value of a symbol是在ELF OBJECT文件内该Linux宝库|ux3PX.MTB
symbol的地址。该地址通常需要被重新定位(加上该object装载到内存的基地址
1y%RmlQk0^)~0(base load address)). 从而构成该symbol在内存中的绝对地址。
Q,B4W
A&I0一个符号表入口有如下的格式:
gD+M5V#R'c0 typedef struct
a}dC`1?Mw/F+u7X0{
k9_+x\-O1z0 Elf32_Word st_name; /* Symbol name (string tbl index) */Linux宝库*x+i4y6y!kt2pj
Elf32_Addr st_value; /* Symbol value */Linux宝库OWl(hzu)N$W
Elf32_Word st_size; /* Symbol size */
I'q!c+U A7k0 unsigned char st_info; /* Symbol type and binding */Linux宝库z-h1?%DYS!`a(lj%~
unsigned char st_other; /* No defined meaning, 0 */
+}%p*o:{T2Y0 Elf32_Section st_shndx; /* Section index */Linux宝库VQSk*W
k
} Elf32_Sym;
可执行文件他们知道运行时刻他们的地址,所以他们内部的引用符号在编译时候就已
(v$H#Pc-]:_@Q6UWt0经被重定位了。
+Cs;wg_Z%w0★★ GOT(global offset table)
!o)hU0R'L!E;f0GOT是一个数组,存在ELF image的数据段中,他们是一些指向objects的指针(通常
v_-x$I UR
n0是数据objects).动态连接器将重新修改那些编译时还没有确定下来地址的符号的
:X0?3A ]}W'U0GOT入口。所以说GOT在i386动态连接中扮演着重要的角色。
Gz1g@#wy-\{
N0★★ PLT(procedure linkage table)