ELF可执行目标文件
运行内存映像:
链接的过程
1.符号解析:解析符号定义(函数,全局变量和静态变量)
2.重定位
重定位节和符号定义
重定义符号引用(依赖于重定位条目)
动态链接:
1.生成共享库文件
gcc -shared -fpic -o libvector.so 1.c 2.c
2.生成一个可执行目标文件(部分链接)
gcc -o p1 1.c ./libvector.so
3.当加载器加载进而运行p1的时候,注意到p1包含一个.interp节,加载器运行这个
动态链接器重定位libc.so中的代码和数据
动态链接器重定位libvector.so中的代码和数据
重定位p1中对libc.so和libvector.so中的符号引用
最后动态链接器将控制转移到main函数
位置无关代码对变量的引用
int adc = 0;
void add()
{
adc++;
}
由于adc的位置不确定,他是使用了一个GOT(全局偏移量表)来记录adc的实际地址
2.部分链接文件中的PLT和GOT
如果一个目标文件调用了定义在共享库的任何函数,他就有自己的PLT和GOT
第一步:call addvec()直接访问的是PLT[2]
第二步:第一条PLT指令通过*GOT[4]跳转到下一条,下一条把addvec的ID和动态链接器的参数压入栈中,跳转到动态链接器的
第三步:动态链接器