Linux 下动态链接时函数的延时绑定分析

本文深入探讨了函数地址延迟解析的机制,解释了全局偏移量表(GOT)和过程链接表(PLT)如何协同工作,以实现函数调用时动态链接。通过一个具体的示例,展示了在Linux环境下,动态链接器如何使用GOT和PLT更新函数地址,以及这一过程对程序性能的影响。

定义: 将函数地址的解析推迟到函数调用的时候。

实现方式:通过全局偏移量表【GOT】和过程链接表【PLT】之间的交互来完成。对于每一个调用了定义在共享库中函数的目标模块,那么它就会维持一个自己的GOT和PLT。其中GOT属于数据段的一部分、PLT属于代码段的一部分。

相关数据结构

  • 过程链接表【PLT】:该结构是一个数组,每一个数据成员占用16字节的大小。雁过留声,每一个在共享库中定义的函数都可以在该数组中找到身影。我们下来看一下具体的数据成员所代表的含义:

    • PLT[0]: 是一个特殊的条目,它存在的目的主要是为了跳转到动态链接器中,实现对所调用函数在GOT表中的地址的修改。这个我们稍后会详细谈到。
    • PLT[1]:存放的是系统的启动函数,完成对启动环境的初始化然后调用main函数并处理其返回值。
    • 之后的成员存放的是用户提供的具体函数。
  • 全局偏移量表【GOT】:该结构的存在形式也是一个数组,不同的是每一个条目所占用的大小是8字节,其中PLT表中的数据存放的是相对应的GOT表项的地址。最后对函数实际地址的查找也是通过PLT表的过渡最终由该表最实现的。当函数第一次调用时,GOT表项中的数据指向对应PLT表中的下一条指令。同样的,我们看一下它的成员所代表的含义:

    • GOT[0]与GOT[1]:存放的是函数地址解析时动态链接器需要的有关信息。
    • GOT[2]:存放的是动态链接器模块(Linux下是ld-linux.so)的入口地址
    • GOT[3]:系统的启动函数
    • 之后的数据成员存放的是与PLT对应的用户所提供的函数

用到的程序:
main 函数:

#include "sum.h"

int main (void) {
    int ret = sum(1,2);
    printf("ret:%d\n",ret);
    return 0;
}

子函数sum.h:

#ifndef _SUM_H_
#define _SUM_H_
#include <stdio.h>
int sum (int a,int b);
#endif

子函数sum.c

#include "sum.h"

int sum (int a,int b) {
    return a+b;
}

介绍完相关的数据结构后,我们接下来看一下具体的函数地址解析过程:
我们直接看一下可执行程序的反汇编代码:
在这里插入图片描述
我们可以看到sum@plt这个标志,其中@plt函数是编译器自己加的,我们可以看看里面的代码。
在这里插入图片描述
我们可以通过objdump -R 查看一个可执行程序的GOT地址
在这里插入图片描述
写在前面:
程序调用会首先进入相应的PLT条目,接着会执行图五中的三行代码,#后面所跟的十六进制数是该函数在GOT中对应的表项所在的地址,这几行代码分别完成的功能是

  • 跳转:根据图四图五我们可以判断目前该函数即sum在PLT表中对应的表项为PLT[2],地址0x4020所对应的GOT表项为GOT[4],也就是该函数在GOT表中所存放的地址。此时,程序由PLT[2] -> GOT[4]。目前GOT[4]中保存的数据为对应的PLT[2]中指令的下一条:即后面紧跟的压栈指令
  • 压栈:将调用函数sum的ID(0x1)压入栈中
  • 跳转到PLT[0]所在的位置。

接下来我们看一下跳转到PLT[0]后编译器所做的事情。
在这里插入图片描述

  • 我们可以看到首先将动态链接器的一个参数即GOT[1]压栈
  • 跳转至GOT[2]即动态链接器的入口地址。此时动态链接器利用已经压入栈的两个参数生成该函数(sum)的实际运行地址,然后利用该地址重写GOT[4],并将程序的控制权交给所调用函数。

  • 当后续目标模块中调用函数sum时,该函数还是首先会进入PLT[2]条目,然后跳转到GOT[4],不同的是,此时程序间接跳转会将控制直接转移到sum调用。至此,函数地址的解析便告一段落。
标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于前人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的不足及未来改进方向,展望舆情
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值