长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机视觉

  • ESP32开发

  • Linux系统移植

  • 快速开始

  • 编程小知识

    • YUV图片格式
    • Camera名词解释
    • Linux动态链接中的PLT和GOT
      • 动态重定位执行过程
      • 重定位之后的调用
      • 参考资料
  • 技术
  • 编程小知识
DC Wang
2023-03-01
目录

Linux动态链接中的PLT和GOT

# Linux动态链接中的PLT和GOT

相对于静态库而言,动态库最大的特点在于库的链接过程在运行时而不是在编译时。

存放函数地址的数据表,称为全局偏移表(GOT, Global Offset Table),而那个额外代码段表,称为程序链接表(PLT,Procedure Link Table)。

# 动态重定位执行过程

Linux 动态链接器提供动态重位功能,所有外部函数只有调用时才做重定位,实现延迟绑定功能。下面是以调用puts函数为例画出了整个动态重定位的执行过程:

编译时的PLT和GOT的关系图2

在 _dl_runtime_resolve函数内完成puts符号查找后,将该函数地址地址重定位到对应的GOT表项,并调用。

# 重定位之后的调用

GOT表项已完成重定位的情况下,PLT利用GOT表直接调用到真实的动态库函数,下面puts函数的调用过程:

编译时的PLT和GOT的关系图3

# 参考资料

聊聊Linux动态链接中的PLT和GOT(1)——何谓PLT与GOT (opens new window)

聊聊Linux动态链接中的PLT和GOT(2)——延迟重定位 (opens new window)

聊聊Linux动态链接中的PLT和GOT(3)——公共GOT表项 (opens new window)

聊聊Linux动态链接中的PLT和GOT(4)—— 穿针引线 (opens new window)

Bilibili视频:【pwn】CTF学习:4、PLT表与GOT表 | 延迟绑定机制 (opens new window)

编辑 (opens new window)
#Linux#动态链接
上次更新: 2023/03/31, 22:34:04
Camera名词解释

← Camera名词解释

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式