【Linux】动静态库的使用与软链接的结合

文章目录

  • 前言
  • 一、静态库
    • 1.静态库的创建
    • 2.静态库的链接
    • 3.将库进行打包
    • 4.链接方法:
      • 1.直接链接
      • 2.拷贝到系统路径里面
      • 3.采用软链接方法
  • 二、动态库
    • 1.解决加载找不到动态库的方法
      • 1.直接拷贝
      • 2.建立软链接
      • 3.建立自己的动态路径配置文件
    • 2.为什么动态库权限需可执行而静态库没有
  • 三、关于地址
    • 1.程序没有加载前的地址(程序)
    • 2.程序加载后的地址(进程)
    • 3.动态库使用


前言

库本质就是把一堆(.o)后缀的文件也就是目标文件整合在一起
在这里插入图片描述

一、静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库

1.静态库的创建

[root@localhost linux]# gcc -c mymath.c -o mymath.o
先把文件变成目标文件
生成静态库
[root@localhost linux]# ar -rc libmymath.a   mymath.o 
ar是gnu归档工具,rc表示(replace and create)

格式:
ar -rc 静态库名字(注意格式)  静态库所包含的目标文件

2.静态库的链接

在这里插入图片描述

3.将库进行打包

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

1.第三方库的使用,gcc往后必须加上 -l +库名
2.如果系统中只提供静态链接,则gcc对其进行静态链接
3.如果系统中链接多个库,则直接在gcc后面加上指定路径和库的名字就可以

4.链接方法:

1.直接链接

在这里插入图片描述

2.拷贝到系统路径里面

在这里插入图片描述

一般系统里头文件都在/usr/include
库都在/lib64

将我们的库放到系统路径下,我们就不需要在编译的时候指定我们的路径了,因为系统会自己到系统路径中找,但我们还是要带上我们的库名的,这是规定

3.采用软链接方法

先为头文件部分以及库文件创建软链接放入系统路径中去
在这里插入图片描述
在这里插入图片描述
编译链接
在这里插入图片描述

二、动态库

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码

//生成目标文件,需要带-fPIC
[root@localhost linux]# gcc -fPIC -c myprint.c mylog.c 
//创建动态库
[root@localhost linux]# gcc -shared -o libmymath.so  *.o  

在这里插入图片描述

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

我们前面只告诉了编译器我的动态库在什么位置,但当我程序运行起来的时候就和编译器没关系了,所以我们也要告诉系统(加载器)我的动态库放在哪里!!!
静态链接能找到是因为我们静态库直接整个干到可执行文件里面了,根本不需要去找静态库,因为已经和我原来的可执行程序融为一体了

1.解决加载找不到动态库的方法

1.直接拷贝

和静态库类似,直接拷贝到系统默认库路径 /lib64

2.建立软链接

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

3.建立自己的动态路径配置文件

ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

不认动态库名,只需放入动态库路径,因为当时我们告诉过编译器我们用哪个库了
在这里插入图片描述
将动态库路径写入创建的conf文件
在这里插入图片描述
在这里插入图片描述
重新ldconfig后,我们就能找到动态库的路径,而且是全局有效
在这里插入图片描述

2.为什么动态库权限需可执行而静态库没有

因为我们静态库直接拷贝到源文件中,拷贝完成后,后续程序运行的时候就用不到了,因为我内部已经有了,而我动态库要以可执行程序的形式加载到内存中与可执行程序产生关联,静态库不需要加载到内存

三、关于地址

动态库在内存中加载会被所有程序共享,动态库在运行的时候是要被加载到内存中的

1.exe加入到物理内存后与页表建立映射关系,当需要使用动态库的时候,动态库也会用类似的方法加入到内存中,之后2.exe也要使用和1.exe相同的动态库,操作系统知道库的加载情况,检测到那个库已经加载到内存里面不需要再加载一遍了,所以直接改变进程2的页表,让动态库与其共享区建立联系

在这里插入图片描述

1.程序没有加载前的地址(程序)

编译器也要为操作系统考虑,程序编译后之后,内部就已经有地址了,这里的地址现在来看其实就是虚拟地址

在这里插入图片描述

2.程序加载后的地址(进程)

问:如何执行我们的第一条命令呢?

答:
其实我们在编译好文件的时候,文件中会有一个entry即入口地址存在于表头,我们CPU中的PC会载入程序的入口地址,这个入口地址是虚拟地址,所以我们要借助页表去寻找其物理地址,但因为此时我们入口地址对应的物理地址还未写入页表,这个时候就会发生缺页中断,该程序会加载到物理内存中,物理地址与虚拟地址的映射关系也会被写入页表中,这样就完成了一个循环过程,我执行下面的指令如果没有对应的物理地址会发生缺页中断写入页表

重点:
⭕与此同时,操作系统会为程序对应的进程构建进程地址空间,并让进程中的指针指向其对应的进程地址空间。
当CPU要运行这段进程时,操作系统会把地址空间代码区的code_start送入CPU,CPU进入代码区后从main函数作为入口开始执行程序
🚩而因为编译器在编译程序代码内部的逻辑地址时,同样也是遵循进程地址空间的规则来编址的,所以当为进程构建地址空间时,其地址空间中的各个虚拟地址是直接使用编译器在编译可执行程序时生成的逻辑地址。
所以当CPU要开始执行程序时,是拿到了main函数的虚拟地址,再通过页表映射到物理内存中的物理地址,找到main函数加载到内存中的代码数据并运行,而在main函数运行的过程中进行了fun函数的调用,这时CPU读取到的依旧是fun函数的虚拟地址(可执行程序中的逻辑地址),然后再次通过页表映射到物理内存中的物理地址

CPU在运行时,读取的都是指令,指令中便包含了地址,而自始至终,CPU读取的都是虚拟地址,没有见过物理地址

在这里插入图片描述

3.动态库使用

问:我们可执行程序,如何找到动态库中我们要使用的特定部分呢?
*
答:页表中会存储动态库的起始位置的虚拟地址与物理地址的链接,动态库直接采用偏移量对库中函数进行编址,我们知道printf的偏移量后再知道动态库的起始地址,就能再动态库中找到printf

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/164935.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【WSL/WSL2-Ubuntu】突破界限:不使用服务器在一台Windows搭建Nginx+FastDFS

打造超级开发环境:Nginx和FastDFS在WSL中的完美结合 前言 随着软件开发领域的快速发展,跨平台的开发环境变得日益重要。Windows Subsystem for Linux(WSL)和WSL 2为开发者提供了在Windows操作系统上体验Linux环境的便捷途径。本…

javaspringbootmysql学生社团管理系统26281-计算机毕业设计项目选题推荐(附源码)

目录 摘要 Abstract 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析…

用户增长模型:3A3R策略模型

一、概述 A - A - A - R - R - R 增长模型,即3A3R策略模型,由海盗模型演变而来,是目前使用最多、适用范围最广的增长策略模型。原始的海盗模型由 Acquisition (获客)、 Activation (活跃)、 Re…

【选题推荐】软件工程毕设选题可以选什么

文章目录 0 简介1 如何选题2 最新软件工程毕设选题3 最后 0 简介 学长搜集分享最新的软件工程业专业毕设选题,难度适中,适合作为毕业设计,大家参考。 学长整理的题目标准: 相对容易工作量达标题目新颖 1 如何选题 最近非常多的…

C语言选择结构 if 语句

if语句 程序运行结构if语句常见三种形式单行格式if语句多行格式if语句多条件的if语句 嵌套if语句if语句案例三只鸡那只重 if语句注意事项 程序运行结构 C语言支持最基本的三种程序运行结构:顺序结构、选择结构(分支结构)、循环结构 顺序结构&#xff1…

2023年高压电工证考试题库及高压电工试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2023年高压电工证考试题库及高压电工试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试大纲随机出的高压…

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例

上链接: P5250 【深基17.例5】木材仓库 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P5250上题干: 题目描述 博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是…

Java面向对象(高级)-- 类的成员之四:代码块

文章目录 一、回顾(1)三条主线(2)类中可以声明的结构及作用1.结构2.作用 二、代码块(1)代码块的修饰与分类1. 代码块的修饰2. 代码块的分类3. 举例 (2) 静态代码块1. 语法格式2. 静态…

两栏布局:左侧固定,右侧自适应

左侧宽度固定&#xff0c;右侧宽度自适应剩余空间 方法一&#xff1a;float margin 方法二&#xff1a;flex布局 相关HTML代码 <div class"container"><div class"left"></div><div class"main"></div> </d…

BGP基本配置

配置逻辑 完成所有路由器的IGP配置使用直连接口建立EBGP对等体关系使用环回接口建立IBGP对等体关系使用connect-interface命令修改IBGP建邻源IP地址使用next-hop-local命令修改路由传递时的下一跳属性若存在使用环回接口建立EBGP对等体关系&#xff0c;则需要建立通讯条件&…

CentOS 7 安装CMake指定版本3.21.2

背景&#xff1a;今天在CentOS 7 电脑上安装C 日志框架SpdLog-1.12.0&#xff0c;提示如下错误信息&#xff1a; [rootlocalhost build]# cmake .. && make -j CMake Error at CMakeLists.txt:3 (cmake_minimum_required):CMake 3.10...3.21 or higher is required. …

Mysql-索引

1.介绍 索引是数据库管理系统中用于提高查询速度的一种数据结构。在MySQL中&#xff0c;索引可以看作是一种特殊的表&#xff0c;其中包含了对数据表中特定列的值及其在数据表中的位置信息。通过使用索引&#xff0c;MySQL可以在不需要扫描整个表的情况下快速找到与查询条件匹…

三栏布局,中间自适应

方法一&#xff1a;两边使用float 中间使用margin 方法二&#xff1a;两边使用absolute 中间使用margin 方法三&#xff1a;flex 布局 方法四&#xff1a;grid 布局 方法一&#xff1a;相关HTML代码【两边使用float 中间使用margin】 <div class"container"…

类和对象(8):explicit,static成员,友元,内部类

一、explicit class Date { public:Date(int year 2023, int month 1, int day 1):_year(year),_month(month),_day(day){}private:int _year;int _month;int _day; };int main() {// Date d1(1); // 这是正常初始化Date d1 1;return 0; }不妨猜测一下&#xff0c;d1的初始…

2023年【安全员-A证】报名考试及安全员-A证新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证报名考试是安全生产模拟考试一点通总题库中生成的一套安全员-A证新版试题&#xff0c;安全生产模拟考试一点通上安全员-A证作业手机同步练习。2023年【安全员-A证】报名考试及安全员-A证新版试题 1、【多选…

LeetCode(29)三数之和【双指针】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 三数之和 1.题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复…

SpringBoot-AOP学习案例

4. AOP案例 SpringAOP的相关知识我们就已经全部学习完毕了。最后我们要通过一个案例来对AOP进行一个综合的应用。 4.1 需求 需求&#xff1a;将案例中增、删、改相关接口的操作日志记录到数据库表中 就是当访问部门管理和员工管理当中的增、删、改相关功能接口时&#xff0…

单线程的JS中Vue导致的“线程安全”问题

目录 现象分析原因 浏览器中Js是单线程的&#xff0c;当然不可能出现线程安全问题。只是遇到的问题的现象与多线程的情况十分相似&#xff0c;导致对不了解Vue实现的我怀疑起了人生… 现象 项目中用到了element-plus中的加载组件&#xff0c;简单封装了一下&#xff0c;用来保…

100.相同的树(LeetCode)

关于树的递归问题&#xff0c;永远考虑两方面&#xff1a;返回条件和子问题 先考虑返回条件&#xff0c;如果当前的根节点不相同&#xff0c;那就返回false&#xff08;注意&#xff0c;不要判断相等时返回什么&#xff0c;因为当前相等并不能说明后面节点相等&#xff0c;所以…

【每日一题】689. 三个无重叠子数组的最大和-2023.11.19

题目&#xff1a; 689. 三个无重叠子数组的最大和 给你一个整数数组 nums 和一个整数 k &#xff0c;找出三个长度为 k 、互不重叠、且全部数字和&#xff08;3 * k 项&#xff09;最大的子数组&#xff0c;并返回这三个子数组。 以下标的数组形式返回结果&#xff0c;数组中…