动态链接&&静态链接

文章探讨了动态链接过程中函数和变量的重定位,特别是GOT表和PLT(ProcedureLinkageTable)的作用。静态链接时,符号表合并并完成重定位;动态链接则引入GOT和PLT,GOT用于存储地址,PLT提供调用函数的间接方式,提高性能。通过理解PLT和GOT,以及相关的重定位节如.got.plt、.rel.dyn、.rel.plt,能更好地掌握动态链接的原理。
摘要由CSDN通过智能技术生成

前言:大学时候看书遗留的问题,在工作后理解了,记录一下解决过程。
对静态链接没有很大的问题,每一个.o文件都有一张符号表,然后链接的时候,遍历所有.o文件的符号表并将它们组织起来形成一个全局符号表,第二次遍历的时候确认.o文件需要重定位的符号,从全局符号表中拿出符号地址填入到引用的位置,从而实现静态重定位。
参考:
Linux 动态链接过程中的【重定位】底层原理-51CTO.COM

当时对动态链接的理解是增加一层间接性,即代码段对绝对地址的引用换成对数据段地址的引用,加载动态库后,即知道了符号的地址,然后将地址填入数据段内从而动态链接实现了符号的重定位。这里的符号包括函数和变量。

数据段中存放间接跳转的地址称为GOT表,对变量的重定位到这里应该很清晰了,当时对函数重定位就很迷惑,不知其然,更不知其所以然。当时不能理解为什么同样都是符号重定位,为什么函数就要比变量多一些操作呢(多的操作指PLT)?
在这里知道了其所以然:

计算机科学基础知识(五): 动态链接
大致思路是这样的:设想一下用GOT如何实现函数重定位,保存调用的函数在符号表的偏移量,在调用函数处跳到数据段的GOT首地址,在GOT表里根据偏移量得到目标符号的地址。实现这些行为的代码若放到GOT表里会显得很乱,于是把这些代码汇总起来放到了PLT(属于代码段,在进程加载和运行过程都不会发生改变),就是说编译器迭代的功能真给力。
总的来说函数使用GOT动态重定位也是可以的,而使用PLT会提高函数符号重定位的性能。

在这里知道了其然:

聊聊Linux动态链接中的PLT和GOT(3)——公共GOT表项_boazheng的博客-CSDN博客

在博主画的图里,调用关系就很明了了。通过push 入栈来给函数传递参数进而确定符号表需要动态重定位的符号。

这里遇到好多section名称:.got、.got.plt、.rel.dyn、.rel.plt。等能把这些节和重定位过程联系起来才算真正的理解了吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值