《深入浅出计算机组成原理》学习笔记 Day5

动态链接

*
1. 静态链接与动态链接
2. 地址无关
3. PLT 和 GOT
参考

1. 静态链接与动态链接

静态链接(Static Link)是通过合并代码段的方法来使程序装载至内存;
动态链接(Dynamic Link)则是链接加载到内存中的 共享库(Shared Libraries)。

在 Windows 下,这些共享库文件就是 .dll 文件,也就是 Dynamic-Link Library(DLL,动态链接库)。

在 Linux 下,这些共享库文件就是 .so 文件,也就是 Shared Object(动态链接库)。

2. 地址无关

在程序运行的时候共享代码,这些机器码必须满足 地址无关。也就是说,编译出来的共享库文件的指令代码,是地址无关码(Position-Independent Code)。即,这段代码无论加载在哪个内存地址,都能够正常执行。

而常见的地址相关的代码,比如绝对地址代码(Absolute Code)、利用重定位表的代码等,都是地址相关的代码。例如重定位表,在程序链接的时候,就把函数调用后要跳转访问的地址确定下来了,这意味着,如果这个函数加载到一个不同的内存地址,跳转就会失败。

《深入浅出计算机组成原理》学习笔记 Day5
对于所有动态链接共享库的程序来讲,虽然共享库用的都是同一段物理内存地址,但是在不同的应用程序里,它所在的虚拟内存地址是不同的。

我们没办法、也不应该要求动态链接同一个共享库的不同程序,必须把这个共享库所使用的虚拟内存地址变成一致。如果这样的话,我们写的程序就必须明确地知道内存的内存地址分配。

动态代码库内部的变量和函数调用都很容易解决,我们只需要使用 相对地址(Relative Address)就好了。各种指令中使用到的内存地址,给出的不是一个绝对的地址空间,而是一个相对于当前指令偏移量的内存地址。因为整个共享库是放在一段连续的虚拟内存地址中的,无论装载到哪一段地址,不同指令之间的相对地址都是不变的。

; 3. PLT 和 GOT

PLT程序链接表(Procedure Link Table)。

在共享库的 data section 里面,保存了一张 全局偏移表(GOT,Global Offset Table)。 虽然共享库的代码部分的物理内存是共享的,但是数据部是使用动态链接的应用程序里面各加载一份的

所有需要引用当前共享库外部的地址的指令,都会查询 GOT,来找到当前运行程序的虚拟内存里的对应位置。而 GOT 表里面的数据,则是在加载一个个共享库的时候写进去的。

不同的进程,调用同样的动态链接文件,各自 GOT 里面指向最终加载的动态链接库里面的虚拟内存地址是不同的。

这样,虽然不同的程序调用的同样的动态库,各自的内存地址是独立的,调用的又都是同一个动态库,但是不需要去修改动态库里面的代码所使用的地址,而是各个程序各自维护好自己的 GOT,能够找到对应的动态库就好了。

我们的 GOT 表位于共享库自己的数据段里。GOT 表在内存里和对应的代码段位置之间的偏移量,始终是确定的。这样,我们的共享库就是地址无关的代码,对应的各个程序只需要在物理内存里面加载同一份代码。而我们又要通过各个可执行程序在加载时,生成的各不相同的 GOT 表,来找到它需要调用到的外部变量和函数的地址。

参考

极客时间《深入浅出计算机组成原理》:http://gk.link/a/11UMi

Original: https://blog.csdn.net/weixin_50697073/article/details/128739980
Author: Balaaam
Title: 《深入浅出计算机组成原理》学习笔记 Day5

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/812822/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python基础之Flask快速入门

    概述 当你爬取了很多数据,却无法展示,当你生成了漂亮图表,却不知如何给客户看,这是因为你缺少一个web项目。本文以一个简单的小例子,简述如何通过flask创建一个web项目,并成功…

    Python 2023年8月10日
    060
  • pandas pivot、pivot_table和melt

    pandas的pivot和pivot_table 用于表格数据的行列互换,而melt用于unpivot 表格数据。 1,pivot 有如下数据集: import pandas as…

    Python 2023年8月6日
    038
  • Python Scrapy

    一、Scrapy结构及运作流程 1、组件结构及流程 I、Spider Spider由自己定义爬虫逻辑,主要是编写Request以及处理Response。 II、Scheduler …

    Python 2023年10月6日
    034
  • pytest学习和使用1-pytest安装和版本查看

    1 pytest安装和初步使用 1 学习来源 2 依赖的环境 3 本文学习环境 4 pytest安装 5 查看pytest版本 1 学习来源 https://docs.pytest…

    Python 2023年9月10日
    054
  • 科学计算基础软件包NumPy入门讲座(2):基本概念

    文章目录 1 安装 2 导入 3 配置 * 3.1 设置显式格式 3.2 设置警告信息 4 基本概念 * 4.1 NumPy数组的数据类型 4.2 NumPy数组的属性 4.3 维…

    Python 2023年8月27日
    034
  • Pandas 最全的使用方式(上)

    大家好,作为一名互联网行业的小白,写博客只是为了巩固自己学习的知识,但由于水平有限,博客中难免会有一些错误出现,有不妥之处恳请各位大佬指点一二!博客主页:链接:https://bl…

    Python 2023年8月7日
    063
  • django8.5 项目部署——Nginx

    改完之后就重启nginx: sudo /etc/init.d/nginx restart. 用到的命令有: sudo /etc/init.d/nginx start|stop|re…

    Python 2023年8月5日
    039
  • 豆瓣电影Top250数据分析

    此项目是b站上一视频的学习成果,此项目主要技术就是用了python爬虫搜集数据然后用Flask框架、Echarts、WordCloud等技术实现数据可视化 视频地址:Python爬…

    Python 2023年8月10日
    053
  • CTC算法详解

    以语音识别为例,如果现在有一个包含剪辑语音以及相应文本的数据集,如何将语音片段与文本字符一一对应,是训练语音识别器面临的首要问题。为了解决上述问题,我们制定简单的规则,如每个字符对…

    Python 2023年10月28日
    045
  • python基础之字典的创建

    博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢…

    Python 2023年8月2日
    055
  • 初识设计模式 – 解释器模式

    在某些情况下,为了更好地描述某一些特定类型的问题,我们可以创建一种新的语言,这种语言拥有自己的表达式和结构,即文法规则。 解释器设计模式(Interpreter Design Pa…

    Python 2023年10月15日
    026
  • Nmap使用教程图文教程(超详细)

    Nmap使用教程 一、端口扫描 * 1. 指定端口 2. 指定扫描方式 – 2.1 TCP全连接扫描 2.2 SYN半链接扫描 2.3 隐秘扫描 二、主机探测 三、服务…

    Python 2023年11月6日
    069
  • Pygame游戏编程

    1. Pygame常用模块 Pygame 做游戏开发的优势在于不需要过多考虑与底层开发相关的内容,而可 以把工作重心放在游戏逻辑上。例如,Pygame 中集成了很多和底层开发相关的…

    Python 2023年9月19日
    029
  • Python学习:构造函数与析构函数

    __init__(self), 这个方法就是构造函数,在实例化的时候自动调用。 所有如果这个函数内有打印的方法,当实例出来的时候会打印里面的信息。 有了 __init__方法,在创…

    Python 2023年10月31日
    034
  • Pygame实战:Python趣味编程之我的兔子终于变了游戏啦

    导语 养过兔子的人应该有同感,看似温柔端庄的兔子实际上是充满活力的小恶魔。它们每天钻来钻去、爬高上低、跳来跳去、咬这个啃那个….每天都在想着新法子调皮捣蛋。 害!虽说小…

    Python 2023年9月22日
    035
  • Python数据分析与展示——Matplotlib绘制折线图

    1.Matplotlib介绍 Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab启发。 matplotlib.pyplot是绘制各类可视化图形的命令字库,相当于…

    Python 2023年8月31日
    059
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球