动静态库(完结版)

devtools/2024/10/18 22:33:26/

文章目录

  • 接上篇完成blog
  • 第三方库安装演示
  • 动态库加载原理

接上篇完成blog

上篇链接

第三方库安装演示

	sudo yum install -y ncurses-devel

下载完成之后
在系统目录下面一定能找到对应的头文件和库文件

在这里插入图片描述

此时使用第三方库:

在这里插入图片描述

编译之后按错误提示是对应的函数找不到,所以链接库文件,库的路径在系统目录下,此时不需要指出

在这里插入图片描述
执行结果:
在这里插入图片描述

动态库加载原理

上篇提到,动态库的编译要使用

gcc -fPIC -c xxx.c 

-fPIC叫做与位置无关码

1.在linux下,可执行程序的格式叫做ELF格式(有规则的二进制格式).

在这里插入图片描述
在这里插入图片描述

2.程序没有被加载到内存,程序内部有地址吗? 有!!!

将程序编成二进制后,变量名,函数这些都不存在,都会变成相应的汇编操作
编译的时候,对代码进行编址,遵守虚拟地址空间

虚拟地址空间不仅是OS的概念,编译器在编译的时候,也会遵守这个规则,这样才能在加载的时候,进行从磁盘文件到内存的映射关系
虚拟地址空间更是一种标准
虚拟地址(逻辑地址) = 基地址+偏移量

在代码还没有被加载的时候,
对应的变量和代码就已经有了自己的虚拟地址空间
这也叫做逻辑地址,
即基地址+偏移量
0 +[0,FFFFFFFF]
这种起始偏移量为0的对可执行程序的编址方式叫做平坦模式

程序有代码区和数据区,
将代码区的起始地址放在寄存器
数据区的起始地址和偏移量是什么,也会记在里面
对于每个可执行程序形成一个段,起始地址和偏移量就是通过这样的方式去定位的

当代的linux应用了虚拟地址,所以采用平坦模式,这样通过偏移量就能确定代码区和数据区

程序在编址时就是将所有的代码封成对应的区域

在这里插入图片描述

3.绝对编址,相对编址

在内存中的一个程序
在这里插入图片描述

相对编址:

相对编址更适合对库中的函数形成地址
这些函数只要记住相对于库中的偏移量就能找到这个函数

所以fPIC也就来了,与位置无关码 适合平坦模式的可执行程序

绝对编址:

每次程序加载随机分配的地址

4.库被加载之后,要被映射到指定的使用了该库们的进程的地址空间的共享区部分,库要加载前可以放在共享区的任意位置,都能正常运行
静态库文件的链接

在这里插入图片描述
动态库文件的链接

在这里插入图片描述
再页表部分最终这个动态库也会与虚拟内存通过页表进行映射

像程序被加载到内存中,是随机分布的
库被加载到内存中也是随机分布
因为都可以通过页表映射找到对应的区域

很重要的一张图,由于限制只能放这么大,链接直达下载
在这里插入图片描述

未来,当有一个新进程被启动,也要加载使用这个库,加载这个库内的方法
对于已经加载的方法直接call调用,没有的方法,会将方法直接映射到共享区
然后进行对应的代码调用即可

同样一张图概括main函数的整个过程,链接直达下载

在这里插入图片描述

创作不易,有用请三连,谢谢支持~~~


http://www.ppmy.cn/devtools/27652.html

相关文章

Matlab绘制对数轴

Matlab绘制对数轴 在Matlab中,可以使用semilogx和semilogy函数分别绘制对数坐标轴和线性坐标轴的图形,可以使用loglog绘制双对数轴图形。 使用semilogx函数绘制对数x轴的图形示例: x linspace(0.1, 10, 100); % 生成从0.1到10的100个等间隔…

java基础郎波版chapter1习题

文章目录 1.简述Java 技术体系的组成Java 编程语言:Java 虚拟机 (JVM):Java 类库:开发工具(JDK):Java EE (Enterprise Edition):Java ME (Micro Edition):Java Platform, Standard E…

邦注科技 温控箱对企业的重要性

注塑加工是将加热的熔融塑料注入模具中形成所需产品的工艺过程。良好的注塑加工工艺需要控制好许多参数,其中最重要的因素之一就是模具的温度。模具温度的不稳定会导致产品尺寸大小、表面缺陷等方面的问题,甚至会导致生产不良品,加大生产成本…

(四)小程序学习笔记——自定义组件

1、组件注册——usingComponents (1)全局注册:在app.json文件中配置 usingComponents进行注册,注册后可以在任意页面使用。 (2)局部注册,在页面的json文件中配置suingComponents进行注册&#…

题解:CF1951E(No Palindromes)

题解:CF1951E(No Palindromes) 题目翻译:给定一个长度为 n n n 的字符串 s s s,询问是否可以将其分成若干份,使得每一份都不是回文串。若可以,输出 YES 并给出任意一组方案;若不可…

08_Scala函数式编程重点

文章目录 函数式编程1.创建简单函数2.可变参数3.默认参数4.函数式编程,代码简化 函数式编程 函数式编程是对功能进行封装,最终是需要等号 def test() {} //于python略有不同1.创建简单函数 // 1.定义函数def test(): Unit {}牛逼之处就是可以在m…

a_bogus逆向分析

a_bogus逆向分析 前言log插桩步骤一分析步骤二分析 前言 最新版本的a_bogus生成步骤大致分为以下4步:步骤操作一根据请求的params、data、useragent以及环境参数生成四个数组二通过一些规则把步骤一生成的四个数组组合成一个大数组三通过一些随机数生成一个乱码字符…

设计模式 基本认识

文章目录 设计模式的作用设计模式三原则设计模式与类图设计模式的分类 设计模式的作用 设计模式是在软件设计过程中针对常见问题的解决方案的一种通用、可重用的解决方案。设计模式提供了一种经过验证的方法,可以帮助开发人员解决特定类型的问题,并在软…