动态链接的过程

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和动态链接器的参数压入栈中,跳转到动态链接器的

第三步:动态链接器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值