『 Linux 』动态库的加载

news2025/1/12 16:06:08

文章目录

    • 动静态库的区别
    • 动态库-共享库
    • 动态库的加载
      • 动态库的管理
    • 总结


动静态库的区别

请添加图片描述

  • 动态库(Dynamic Libraries)

    • 链接方式

      动态链接,程序在运行时(而不是在编译时)与动态库链接;

      操作系统负责加载动态库文件;

    • 文件大小

      使用动态库的应用程序通常其可执行文件大小更小;

      因为库代码在运行时将会从单独的库文件进行加载;

    • 内存使用

      如果多个程序同时使用一个动态库,则该库在内存中只需要加载一次,节省系统资源;

    • 更新和发布

      更新动态库较为方便;

      只需替换动态库文件本身即可而不需要重新编译使用它的程序;

      使得动态库适用于需要频繁更新或者维护的软件组件;

  • 静态库(Static Libraries)

    • 链接方式

      静态链接,程序在编译时与静态库进行链接,静态库的代码数据被复制到最终的可执行文件中;

    • 文件大小

      使用静态库的应用程序通常会有更大的可执行文件,因为其静态库的代码和数据将被集中到应用程序中;

    • 内存使用

      每个使用静态库的应用程序都会有自己的库代码副本;

      在内存中可能会导致重复冗余的内容;

    • 更新和发布

      更新你需要使用到静态库的组件时必须重新编译整个程序;

      这意味着静态库适合不经常更新的库,或者用户希望应用程序是完全独立且不依赖外部其他库文件时;


动态库-共享库

请添加图片描述

与静态库不同,动态库在进程运行时要被加载;

一般情况下常见的动态库会被所有的可执行程序动态链接,故动态库又被称为共享库;

这意味着动态库在系统中加载后将会被所有的进程共享;

磁盘中的文件需要被管理,动态库是文件也需要被管理;

当一个可执行程序需要加载这个动态库时将会以特定的路径将动态库加载至内存;

若是一个可执行程序依赖于多个动态库时将会把这些依赖的动态库同样加载至内存当中;

这些被加载至内存的动态库将以 先描述再组织 的方式被操作系统进行管理,而若是有其他进程需要调用这些动态库时只需要间接在操作系统的管理下找到这个动态库并与其他进程进行共用即可;

动态库的共享属性主要围绕以下几点:

  • 资源共享

    动态库允许其代码在物理内存中至有一份拷贝而可以被多个正在运行的进程所共享;

    这种方式与静态库形成对比,静态库的代码被复制到每个使用它的可执行文件当中,导致相同的代码在内存中形成冗余;

    动态库通过减少重复的代码加载有效减少了系统的内存占用从而提高内存使用效率;

  • 动态链接

    程序在运行时加载动态库被称为动态链接,类比C++中的多态;

    这意味可执行程序将在运行时寻找并链接其依赖的动态库;

    它们可以在运行时共享这个库的同一个实例而不需要在每个程序中进行加载;

  • 跨进程共享

    操作系统负责管理动态库的链接和加载;

    当第一个程序请求加载特定的动态库时操作系统将会把这个动态库加载进内存并对其管理;

    此后如果有其他进程也依赖这个动态库时将直接在操作系统的管理下找到这个库并进行链接;

  • 减少磁盘和内存使用

    动态库通过其共享属性减少系统中重复的代码存储和加载从而介绍磁盘空间和运行时的内存占用;


动态库的加载

请添加图片描述

  • 可执行程序的执行

    用户请求执行一个可执行文件;

    当操作系统接收到执行请求时将会从文件系统重读取指定的可执行文件;

    这个文件包含了程序的代码数据以及其动态库的依赖信息;

  • 进程的创建

    • 创建进程控制块task_struct

      当程序被执行时其将加载进内存并成为进程;

      操作系统将会为新的进程分配一个task_struct结构体用于存储进程的所有信息;

      包括进程状态,PID,进程地址空间指针,页表指针等等;

    • 分配进程地址空间

      操作系统将会为进程分配一个虚拟地址空间并根据可执行文件的内容初始化代码段和数据段;

  • 动态库的加载

    加载器解析可执行文件中的动态库依赖信息,并根据依赖信息在磁盘上查找对应的动态库文件;

    这个过程可能会参考LD_LIBRARY_PATH环境变量,/etc/ld.so.cache文件以及标准路径如/lib64//usr/lib;

    找到动态库文件后,加载器将会把动态库的内容加载进物理内存;

    如果涉及多个进程依赖同一个动态库,操作系统将会让这些进程共享内存中的同一份动态库以节省内存;

    具体的方法是在当前被管理的动态库中寻找新进程所依赖的动态库是否已经在当前物理内存中留有副本,若是有则直接进行链接从而减少I/O次数;

    当动态库被加载进内存时同样需要被页表进行映射以保证其安全性;

    一般情况下动态库将会被映射至每个依赖该动态库的进程地址空间中用户空间的共享区当中;

    若是某个进程需要对其中的内容进行写入操作时将发生写时拷贝,将会为这个进程单独拷贝一份私有的内容为这个进程服务;

  • 进程的运行

    加载器对动态库进行重定位处理,解析程序对动态库中符号的引用以确保这些引用指向正确的内存地址;

    当所有依赖的动态库被加载完成后,操作系统将开始执行进程的代码,进程也将进入运行状态;

  • 进程的管理

    操作系统将通过task_struct管理进程的执行,根据调度策略在不同进程间切换以确保系统资源的合理分配使用;


动态库的管理

请添加图片描述

操作系统通过间接的方式了解当前系统中所有已经被加载的库与未被加载的库;

动态库的管理同样是采用 “先描述后组织” 的方式进行;

在操作系统中存在一个结构体为link_map;

这个结构体用来表示每个加载的动态库(共享库);

其结构体可能包含库的内存地址,库的名称,指向库的动态段的指针等;

struct link_map {
  /* 库的加载地址 */
  ElfW(Addr) l_addr;

  /* 库的路径名 */
  char* l_name;

  /* 指向库的动态段(.dynamic节)的指针 */
  ElfW(Dyn)* l_ld;

  /* 链表中的下一个和上一个link_map结构的指针 */
  struct link_map *l_next, *l_prev;
};

总结

请添加图片描述

动态库和静态库是软件开发中两种主要的代码库链接方式;

其中动态库在程序运行时被加载并允许代码在物理内存中只有一份拷贝而被多个进程共享从而减少系统资源的消耗;

相比之下,静态库在程序编译时被整合进可执行文件;

导致每个程序都包含了一份库的副本,增加了程序的大小和内存占用;

动态库的管理依赖于操作系统中的结构体,如link_map;

它记录了库的加载地址,名称等信息,确保动态链接和库间依赖关系的正确处理;

通过高效地管理和加载动态库,系统能够提高内存使用效率,简化库的更新过程,并支持跨进程的库共享;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单操作,智能自动化:Windows键鼠模拟软件

一个 Windows 自动化工具,可模拟键盘和鼠标,自动执行任何流程和动作,只需录制动作并运行即可,无需编写脚本,只需按录制,然后播放即可,大小仅 35 KB,且免费无广告。 界面介绍 **打开…

LLM下载、私有化部署与ollam应用

参考: Qwen2 阿里最强开源大模型(Qwen2-7B)本地部署、API调用和WebUI对话机器人-CSDN博客 本地快速安装运行史上最强开源LLaMa3大模型 - 廖雪峰的官方网站 (liaoxuefeng.com) 1.下载网站 1.https://www.hugging-face.org/ 2.https://hf-m…

嵌入式linux中设备树使用of函数操作基本方法

各位开发者大家好,今天主要给大家分享一下,如何使用of操作函数,获取对应设备树节点先关的属性信息。 第一:of_find_property函数 of_find_property 函数用于在设备树中查找节点下具有指定名称的属性。如果找到了该属性,可以通过返回的属性结构体指针进行进一步的操作,比…

强大高效,推荐这两款分析文章和抠图的AI工具

ChatDOC ChatDOC是一款基于ChatGPT的AI阅读辅助工具,旨在通过与用户指定的文档进行对话来处理用户的专属数据。它能够帮助用户快速提取文档中的信息,支持多种文件格式,并提供准确的答案。此外,ChatDOC还具备智能格式化、自动摘要生…

博客摘录「 AXI三种接口及DMA DDR XDMA介绍(应用于vivado中的ip调用)」2024年6月10日

关键要点: 1.AXI Stream经过协议转换可使用AXI_FULL(PS与PL间的接口,如GP、HP和ACP)。 2.传输数据类里就涉及一个握手协议,即在主从双方数据通信前,有一个握手的过程。基本内容:数据的传输源会…

A股上市公司MSCI ESG评级面板数据(2017-2023)

数据简介:MSCI ESG(Environmental, Social, and Governance)评级是由 MSCI Inc. 提供的一项服务,旨在评估公司在环境、社会和治理方面的表现。MSCI 是一家全球领先的投资研究和指数提供商,其 ESG 评级被广泛用于评估企…

6月13日 Qtday1

#include "mywidget.h" //腾讯会议的登录界面 MyWidget::MyWidget(QWidget *parent): QMainWindow(parent) {this->setFixedSize(468,830);//主窗口大小this->setStyleSheet("background-color:rgb(255,255,255)");//主窗口背景this->setWindowTi…

采用ava+B/S架构开发的工业级UWB(Ultra-Wideband)室内定系统源码UWB定位系统技术接口及技术特点

采用avaB/S架构开发的工业级UWB(Ultra-Wideband)室内定系统源码UWB定位系统技术接口及技术特点 UWB(Ultra-Wideband)定位技术本身并不直接连接蓝牙或其他无线通信技术进行定位。然而,在实际应用中,UWB定位技…

Salesforce‘s 爱因斯坦机器人助手引领工业聊天机器人时代

CRM的对话式人工智能助手,根据公司数据提供可靠的人工智能响应及日本工业聊天机器人现状 【前言】 爱因斯坦助手(Einstein Copilot)提供可靠的响应,因为它基于公司独特的数据和元数据,使其能够深入了解公司的业务和客…

STM32F103ZET6_HAL_CAN

1定义时钟 2定义按键 按键上拉电阻 3开启串口 4打开CAN(具体什么意思上一篇讲了) 5生成代码 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief …

vue+elementplus模拟“山野愚人居”简单实现个人博客

目录 一、项目介绍 二、项目截图 1.项目结构图 2.项目首页 3.文章详情 4.留言 5.读者 三、源码实现 1.项目依赖package.json 2.项目启动 3.读者页面源码 四、总结 一、项目介绍 模仿原博客:山野愚人居 - 记录我的生活、所见、所闻、所想…… 本项目参考以…

RedHat8.4离线升级内核(漏洞编号CVE-2024-1086)

一、背景 针对Linux内核提取权限漏洞 (漏洞编号CVE-2024-1086),整理离线环境的修复方案。本文以离线修复方案为主进行说明,第八章对在线修复方案进行说明。 (一) 漏洞简介 近日,绿盟科技CERT监测网上有研究员公开披露了一个Lin…

解决electron设置透明背景后,引入element-plus样式问题

首先给当前窗口设置自定义窗口以及背景色。 const mainWindow new BrowserWindow({width: 900,height: 670,show: false,autoHideMenuBar: true,...(process.platform linux ? { icon } : {}),webPreferences: {preload: join(__dirname, ../preload/index.js),sandbox: fal…

问题:棕色试剂瓶用于盛装见光易分解的试剂或溶剂。 #其他#学习方法#微信

问题:棕色试剂瓶用于盛装见光易分解的试剂或溶剂。 A、正确 B、错误 参考答案如图所示

高创新 | CEEMDAN-VMD-BiLSTM-Attention双重分解+双向长短期记忆神经网络+注意力机制多元时间序列预测

目录 效果一览基本介绍模型设计程序设计参考资料 效果一览 基本介绍 高创新 | CEEMDAN-VMD-BiLSTM-Attention双重分解双向长短期记忆神经网络注意力机制多元时间序列预测 本文提出一种基于CEEMDAN 的二次分解方法,通过样本熵重构CEEMDAN 分解后的序列,复…

【iOS】KVC相关总结

目录 1. 什么是KVC?2. 访问对象属性常用方法声明基础使用KeyPath路径多值操作 3. 访问集合属性4. 集合运算符自定义集合运算符 5. 非对象值处理访问基本数据类型访问结构体 6. 属性验证7. 设值和取值原理基本的Getter搜索模式基本的Setter搜索模式NSMutableArray搜索…

webpack代码分割

webpack代码分割方式 entry配置:通过多个 entry 文件来实现动态加载(按需加载):通过主动使用import来动态加载抽取公共代码:使用splitChunks配置来抽取公共代码 基础概念 概念含义Entry入口,Webpack 执行构建的第一步将从 Entr…

vue 中多个表单元素控一个校验规则

1. 场景一 <el-form-itemlabel"确认时长方式"prop"preSubResourceDurationDay" ><div class"confirmDurationDay">最晚使用日期前<el-input-numberv-model"form.preSubResourceDurationDay":precision"0"cla…

vue.js有哪几种甘特图库?Vue.js的5大甘特图库分享!

vue.js有哪几种甘特图库?Vue.js的5大甘特图库分享&#xff01; 如今&#xff0c;软件市场为任何复杂程度的项目提供了各种现成的计划和调度工具&#xff0c;但这些解决方案可能包含过多的功能或缺乏一些必要的功能。这就是为什么许多公司更愿意投资开发基于网络的定制解决方案…

嵌入式实训day3

1、 planet_list["水星","金星","火星","木星"] print(planet_list)planet_list.insert(2,"地球") print(planet_list)planet_list.append("土星") planet_list.append("天王星") planet_list.append(&…