【Linux系统】动态库和静态库 动态库加载

认识动态库静态库

我们有没有使用过库呢?-- 用过c、c++的标准库

c的各种函数,c++的各种STL容器,我们使用他们内部必须得有具体实现。

Linux:   .so(动态库) .a(静态库)  Windows: .dll(动态库) .lib(静态库)

 库是拿来给别人使用的,所以库里面必然没有main函数,库名是去掉前缀lib和后缀.so

静态库

我们知道若干的.o文件能够链接成一个可执行文件。

静态库一般是这些若干目标二进制文件(.o)打包而成。我们一般用gcc -c选项生成.o文件。

一个完整的库需要静态库或动态库加上头文件。

头文件是一个手册,提供函数的声明,告诉用户怎么用。

.o提供实现,我们只需要补上一个main.c,调用头文件提供的方法,然后和.o进行链接,就能形成可执行文件。

我们一般用ar -rc libmyc.a *.o来打包.o文件形成静态库。

 我们把.o文件可以删除了。

 直接执行后是找不到定义的,也就是说gcc/g++是不认识这个库的,gcc/g++默认是认识C/C++库的,但libmyc.a是别人写(第三方提供的),gcc//g++不认识!!!

使用gcc main.c libmyc.a

 我们以后使用库文件肯定是放在某一个目录中去,头文件和静态库分别放到对应目录文件中去。

 我们把头文件放到./mylib/include中,libmyc.a放到./mylib/lib中去。

然后执行gcc main.c libmyc.a

把静态库写入自己指定的文件里。

gcc main.c -I ./mylib/include/ -L ./mylib/lib/ -l myc

其中-I选项: 指定用户自定义头文件路径

-L选项:指定用户自定义库文件路径

-l选项:指行确定的第三方库名称(去掉前缀.so和后缀.a)

动态库

动态库的制作与静态库略有区别,首先产生.o文件的选项就不同,增加了选项-fPIC(与位置无关码)

 然后打包.0文件执行就不是静态库那样执行ar命令,而是执行gcc带选项-shared

 动态库制作成功,把动态库移动我们的库文件中去。

 执行main.c

 

 

为什么会这样?因为 你告诉给了gcc/g++编译器,但你没告诉给操作系统!!!

动态库,因为程序在运行的时候要找到动态库加载并运行!

静态库为什么没这个问题?编译期间,已经将库中的代码,拷贝到我们的可执行程序内部了,加载就和库没有关系了!!!

怎么解决?五种方法来解决!!!

1.安装到系统

可以把.so文件拷贝到系统目录下/lib64

 先切换到root用户下,因为是系统文件,子用户没有权限。

2.建立软链接

在系统路径下建立软链接!!!

 

3.命令行导入环境变量

系统会搜索环境变量的路径!!!

由于这里导入的环境变量是内存级的,是无法永久生效的,重启系统操作系统会加载新的环境变量的内容,而这些使用命令临时导入的环境变量就不存在了!!!

4.修改.bashrc配置文件,让环境变量永久生效

修改配置文件 

 

重启操作系统依然可以正常链接

 

5./etc/ld.so.conf.d 新增动态库搜索的配置文件,ldconfig

 

 切换root创建我们的配置文件。

写入动态库链接路径即可

 需要使用ldconfig用于配置共享库缓存,以便运行时正确的加载动态库。

 

因为gcc在不使用static选项时默认使用动态库。

 此时默认连接的是动态库,如果你没有使用-static,并且只提供.a,只能静态链接当前的.a库,其他库正常动态链接。

-static的意义是什么?必须强制的使用-static将我们的程序进行静态链接,这就要求我们链接的任何库,都必须提供对应的静态库版本。

动态库加载 -- 可执行程序和地址空间

因为静态库是把库中的代码拷贝到可执行程序中了,所以就无需加载!!!

所以不需要考虑静态库。

我们知道一个进程创建要同时创建task_struct, 地址空间,页表来与内存进行关系映射,在地址空间中有一块共享区,我们就需要在动态库加载之后,要映射到当前进程的堆栈之间的共享区,所以动态库也叫共享库。

我们知道c语言标准库就一直在内存中保存,因为我们在编译很多c语言程序时,甚至我们的指令都是用c语言写的,但都链接的是同一个库,这是怎么做到他们可能被映射到共享区的任意区域,仍然能够很好的找到对应的函数执行!!!

我们的可执行程序,编译成功,没有加载运行,二进制代码中有“地址”吗?

 有地址!!!

ELF格式的可执行程序,二进制是有自己的固定格式的,elf可执行程序的头部,可执行程序的属性

可执行程序编译之后,会变成很多行汇编语句,每条汇编语句都有他的地址。

那如何编址?

从000...000 --- ffffff...ffff这种顺序编址方式,我们叫为平坦模式,

上方就是这种模式,其实是一种虚拟地址,又叫逻辑地址!!!

ELF + 加载器可以知道各个区域的起始和结束地址,main函数的入口地址!!!

我们知道进程 = 内核数据结构 + 代码和数据,那么操作系统应该是先创建内核数据结构,然后再加载代码和数据,还是反过来呢?当然是第一种方式!!!

在我们CPU中有很多寄存器,其中有一个类似于pc指针的寄存器,

这个pc指针里面存放的是正在执行指令的下一跳指令的地址,pc指向哪里,CPU就执行哪里的代码!!!

 mm_struct是结构体对象,成员变量呢?

像code_start,code_end...global_start初始值从哪来呢?

从可执行程序来!!!

所以结论:虚拟地址空间概念,不是OS独有的,而是要有OS,编译器,加载器

 1.进程创建阶段,初始化地址空间,让CPU知道main函数入口地址

2.加载每一行代码和数据,就都有了物理地址,自己的虚拟地址自己也知道,然后就可以构建映射了!!!

库被映射到虚拟地址空间的什么位置重要吗?

由于可执行程序汇编代码是平坦模式,所以从0开始,那么每一行代码对应的地址就可以作为偏移量了!!!

库中代码被加载到内存中会有对应物理地址对应,而虚拟地址代表偏移量,那么,在地址空间与内存通过页表映射时就拿到了该行代码在地址空间的虚拟地址,而代码自带的地址可以是一种偏移量,那如何找到我们要执行的代码块,只需要让虚拟地址空间的初始位置 + 偏移量(虚拟地址)即可求得我们要执行代码的那一行。

我们可能不知道虚拟地址空间的共享区初始位置,但偏移量是确定的,所以无论初始位置在哪,总能找到我们想要的代码行!!!

所以虚拟地址空间的位置不重要!!!

即与地址无关

库函数调用其实,也是在我的地址空间返回内来回跳转!

如果库没有加载???OS可以让进程知道!!!

库也要先描述,在组织,被OS管理!

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

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

相关文章

sd调试记录:

现象:SDIO读取TF卡,1bit模式正常(一切操作都正常),4bit模式无法读取: 比如在使用函数f_opendir(&DirInf, SDPath)、f_open(&SDFile, path, FA_CREATE_ALWAYS | FA_WRITE)函数时会出现错…

局部静态变量实现的单例存在多个对象

文章目录 背景测试代码运行测试尝试打开编译器优化进一步分析 背景 业务中出现日志打印失效&#xff0c;发现是因为管理日志对象的单例在运行过程中存在了多例的情况。下面通过还原业务场景来分析该问题。 测试代码 /* A.h */ #ifndef CALSS_A #define CALSS_A#include <…

如何从 Windows 11/10/8.1/8/7 恢复已删除的视频

意外删除了视频或格式化了 SD 卡/硬盘&#xff1f;没有备份已删除的视频&#xff1f;别担心&#xff0c;我们有解决方案来恢复 Windows 11、10 中已删除的视频并处理这种糟糕的情况。 但在了解如何恢复已删除的视频和视频恢复应用程序之前&#xff0c;请知道 Windows 会为您提…

IDEA与通义灵码的智能编程之旅

1 概述 本文主要介绍在IDEA中如何安装和使用通义灵码来助力软件编程,从而提高编程效率,创造更大的个人同企业价值。 2 安装通义灵码 2.1 打开IDEA插件市场 点击IDEA的设置按钮,下拉选择Plugins,如下: 2.2 搜索通义灵码 在搜索框中输入“通义灵码”,如下: 2.3 安…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01—短信/邮件/异常/MD5

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01 环境搭建验证码倒计时短信服务邮件服务验证码短信形式&#xff1a;邮件形式&#xff1a; 异常机制MD5参考 环境搭建 C:\Windows\System32\drivers\etc\hosts 192.168.…

rsyslog日志转发

前言 Rsyslog可用于接受来自各种来源(本地和网络)的输入&#xff0c;转换它们&#xff0c;并将结果输出到不同&#xff08;通过模板和filter过滤&#xff09;的目的地&#xff08;目录文件中&#xff09; rsyslog是一个开源工具&#xff0c;被广泛用于Linux系统以通过TCP/UDP…

树莓派5安装冬瓜HAOS教程

原文来自瀚思彼岸和hasshome 一、安装前准备 &#xff08;1&#xff09;软件 1、树莓派烧录软件Imager 2、冬瓜HAOS镜像 &#xff08;2&#xff09;硬件 1、树莓派5 2、TF卡&#xff08;SanDisk Extreme PRO 64GB U3 A2 V30 4k&#xff09; 3、读卡器 4、键盘和鼠标 5、显…

550kg级大载重长航时无人机直升机技术详解

550kg级大载重长航时无人机直升机&#xff0c;作为一种高性能的无人机系统&#xff0c;具备了多项先进的技术特点&#xff0c;以满足高海拔、高寒等复杂环境下的应用需求。这些无人机直升机通常具备高载重、长航时、强适应性、高可靠性和良好的任务拓展性。 设备由无人直升机平…

ctfshow-web入门-文件上传(web151-web160)

目录 1、web151 2、web152 3、web153 4、web154 5、web155 6、web156 7、web157 8、web158 9、web159 10、web160 1、web151 试了下前端只能传 png 后缀的 将一句话木马改成 png 后缀&#xff0c;上传后用 burpsuite 抓包 绕过前端检测后&#xff0c;改回 php 后缀&am…

(南京观海微电子)——MOS管原理及应用区别

MOS管&#xff1a; 全称为金属氧化物半导体场效应管&#xff08;Metal Oxide Semiconductor Field Effect Transistor&#xff09;&#xff0c;也被称为MOSFET&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;。它是一种半导体器件&#xff0c;常用…

[数据结构] 基于选择的排序 选择排序堆排序

标题&#xff1a;[数据结构] 基于选择的排序 选择排序&&堆排序 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;选择排序 实现&#xff1a;(默认从小到大排序) 优化后实现方法&#xff1a; &#xff08;二&#xff09;堆排序…

latex英文转中文word,及一些latex相关工具分享

前言&#xff1a;想要转换latex生成的英文pdf文件为中文word文件 一、主要步骤 1、文字翻译&#xff1a;直接使用谷歌翻译等辅助将英文翻译成中文即可&#xff1b; 2、图片&#xff1a; 使用latex时一般保存的.png&#xff0c;.bmp格式图片可以直接插入word, 但是.eps或者 .p…

基于Android Studio零食工坊

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 用户 可以浏览商品 &#xff0c; 查询商品 &#xff0c; 加入购物车 &#xff0c; 结算商品 &#xff0c; 查看浏览记录 &#xff0c; 修改密码 &#xff0c; 修改个人信息 &#xff0c; 查询订单 管理员 能够实现商品的…

AIGC专栏12——EasyAnimateV3发布详解 支持图文生视频 最大支持960x960x144帧视频生成

AIGC专栏12——EasyAnimateV3发布详解 支持图&文生视频 最大支持960x960x144帧视频生成 学习前言项目特点生成效果相关地址汇总项目主页Huggingface体验地址Modelscope体验地址源码下载地址 EasyAnimate V3详解技术储备Diffusion Transformer (DiT)Hybrid Motion ModuleU-V…

分布式整合

一、分布式架构介绍 什么是分布式系统 分布式系统指一个硬件或软件组件分布在不同的网络计算机上&#xff0c;彼此之间仅仅通过消息传递进行通信和协调的系统。 通俗的理解&#xff0c;分布式系统就是一个业务拆分成多个子业务&#xff0c;分布在不同的服务器节点&#xff0…

测试环境:使用OpenSSL生成证书并配置Https

文章目录 需求1、安装OpenSSL1.1、安装包下载1.2、安装&#xff08;以window 64位为例&#xff09;1.3、配置环境变量&#xff08;非必须&#xff09; 2、生成证书2.1、新建文件夹2.2、生成根证书2.2.1、生成私钥2.2.2、生成根证书&#xff0c;并且自签名 2.3、服务端证书生成2…

JDBC的基本认识

前提 在了解和学习JDBC之前&#xff0c;大家 已经学习过 java语言 和数据库的基本知识了&#xff0c;今天这篇博客的核心&#xff0c;就是告诉大家 &#xff0c;jdbc 是连接java编译器和数据库&#xff0c;是使用java对数据库进行操作的。 正文 JDBC简介 概念 JDBC的本质 1…

解决微信读书和Apple Books导入epub电子书不显示图片的问题

title: 解决微信读书和Apple Books导入epub电子书不显示图片的问题 tags: 个人成长 categories:杂谈 最近找到一本很喜欢的书的电子版的epub版&#xff0c;发现无论是导入微信读书&#xff0c;还是Apple家的Books, 都无法正常显示图片。 于是我用calibre打开epub电子书&#x…

昇思25天学习打卡营第10天 | 自然语言处理:RNN实现情感分类

1. RNN实现情感分类 1.2 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative(负面) 预测标签: Negative输…

nacos-sdk-python——Python版本Nacos客户端

Nacos&#xff08;Naming and Configuration Service&#xff09;是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它主要用于解决微服务架构中服务发现和配置管理的问题&#xff0c;提供了一站式解决方案。以下是 Nacos 的几个关键功能&#xff1a; 服务发现和健康…