GOT表
GOT表(Global Offset Table) ,又称全局偏移表,位于.data节首,记录着外部符号动态加载后的首地址信息。在静态链接时,每一个外部符号都会在GOT表对应一个表项,静态链接器并每一个表项生成一个对应的重定位项(数据位于.rel.data节,函数位于.rel.text节)。在动态加载时,动态链接器将根据重定位项,修改对应的GOT表中信息,完成重定位。
在访问动态库数据或调用动态库函数时,直接通过相对位移,找到对应的GOT表项,然后根据GOT表项中记录的目标地址信息访问数据或调用函数,从而实现动态加载。
举例说明:
extern int b
;
extern void ext();
int main() {
ext();
}
汇编伪代码如下:
0000050c
<main
>:
0000050c
: 55 pushl
%ebp
....
00000557: e8
00 00 00 00 call
0000055c
0000055c
: 5b popl
%ebx
0000055d
: addl $
0x1204, %ebx
0000055e
: call
*(%ebx
)
通过这种方式,可以发现在调用函数时多使用了三条指令,并多使用了一个