动态链接比静态链接要慢1%~5%,根据动态链接中PIC(与地址无关代码)的原理PIC,可以知道造成该情况的原因如下:
1.动态链接下对于全局和静态数据的访问都要进行复杂的GOT(全局偏移表)定位,然后间接寻址;对于模块间的调用也要先定位GOT,然后再进行跳转
2.动态链接的链接工作是在运行时完成,即程序开始运行时,动态链接器都要进行一次链接工作,而链接工作需要复杂的重定位等工作,减慢了启动速度
针对上述第二个减慢动态链接的原因,提出了延迟绑定(Lazy Binding)的要求:即函数第一次被用到时才进行绑定。通过延迟绑定大大加快了程序的启动速度。而 ELF 则使用了PLT(Procedure Linkage Table,过程链接表)的技术来实现延迟绑定。
动态链接与延迟绑定:PLT详解

动态链接虽然较慢,但通过延迟绑定可提升启动速度。ELF使用PLT(过程链接表)实现延迟绑定,使得函数在首次调用时才进行地址绑定。PLT包括前言、简单实现和真正实现三个部分,通过GOT和GOT.plt表进行函数和全局变量的地址管理。动态链接器的lookup函数在Glibc中为_dl_runtime_resolve。
最低0.47元/天 解锁文章
610

被折叠的 条评论
为什么被折叠?



