Linux:动态库加载、编址

目录

一、库的概念

二、动静态库的加载

2.1绝对编址与相对编址

2.1一般程序的加载

三、动态库的加载


一、库的概念

库默认就是一个磁盘级文件,所以在执行代码时,库和可执行程序都会被加载到内存中,从原理上,库函数的调用依旧是在进程的地址空间中进行的。动态库/共享库只需要加载一份,然后通过页表映射到不同的进程地址空间中,所以就可以做到让多个进程使用同一份代码。

而库的加载由操作系统来决定,并且对已经加载的库进行管理,也就是先描述再组织。

和管理进程时类似,对加载进来的库的管理也可以转变为对链表的增删查改。

每个可执行程序都是有自己的格式信息的,即使可执行程序没有加载到内存中,我们的可执行程序中就有地址 ,可执行程序在没有被加载之前,也已经基本按照类别(比如权限,访问属性等)已经将可执行程序划分为各个区域了。

我们在创建一个进程,执行一个进程时,我们是如何对进程地址空间进行划分处理,去加载代码和数据的呢?操作系统是怎么知道该开辟多大空间怎么划分的呢?

我们进程地址空间里面的很多地址数据,是从要执行的可执行程序中来的。

二、动静态库的加载

2.1绝对编址与相对编址

可执行代码与数据如果从上到下从前到后进行连续的编址,这种方式称为绝对编址,也就是所谓的平坦模式。

如果我们将数据区与代码区分开,代码区从0开始,数据区从0开始,使用这种偏移量的方式,我们一般叫做相对地址也叫逻辑地址。

 虚拟地址空间不仅仅是操作系统要遵守,编译器编译程序时也需要遵守。

2.1一般程序的加载

即使没有加载程序本身也有地址,任何一个函数经过编制就没有变量名了,每个函数都是有入口的,所以程序形成可执行程序存到磁盘中加载到内存之前,本身就有编址了,每个程序还要ELF格式的表头,表头中也会记录类似于入口地址,整个可执行程序的区域划分,和各个区域的起始地址。

最终这个东西才是一个完整的可执行程序,而它的编址方式也采用绝对编址,从上到下挨着进行编,当然我们也可以将其看作其在磁盘中的逻辑地址也就是0+0X0000。

要将可执行程序加载到内存首先要创建一个进程,首先创建task_struct即PCB进程控制块,然后加载进程地址空间,而进程地址空间mm_strucr是从可执行程序的ELF表头来加载的。所以不同的程序就有不同的正文段,已初始化未初始化的范围大小。

而cpu中存在一个寄存器CR3保存页表的起始地址,而进程地址空间可以用可执行程序本身来进行初始化,所以可执行程序的大小也决定了进程地址空间的大小,然后将可执行程序代码加载到物理内存中,此时加载到物理内存的地址就是所谓的真实物理地址,而此时可执行程序内部的绝对编址就直接作为虚拟地址和物理地址进行映射建立页表。

而cpu寄存器中有个pc指针,也叫程序计数器,保存正在执行的下一条指令的地址,将ELF中存储的入口地址加载到pc指针,cpu中还有指令寄存器,经过MMU加页表将虚拟地址转换为物理地址,将指令读取然后去内存中查找执行。

所谓的地址空间本质是由操作系统+编译器+计算机体系结构(CPU)三者配合完成的。

所以逻辑地址和虚拟地址以及线性地址都是一个概念,物理地址则是在内存中的地址。

三、动态库的加载

 而可执行程序如何和库进行链接呢?

而库在磁盘中是按相对编制的方法来编址的,库有个起始地址,通过库的起始地址加上里面的各种函数指令所对应的偏移量来找到并执行该指令,而链接时只需要将调用的指令变成库的起始地点加上偏移量的方式存放在可执行程序中,并在前面包含头文件。

库加载到内存后,操作系统为了管理这个库,就会进行先描述再组织,会记录下来这个库被加载到了哪个位置。当cpu去执行和该库相关的指令时,系统只需要通过动态链接知道要执行哪个库,然后找到库的起始地址加上偏移量映射到共享区中库的虚拟地址,然后再通过页表找到库在内存中的位置,然后将指令加载到cpu去执行。

而库的地址在加载到进程地址空间时,一般是通过编址的地址加上偏移量形成一个地址然后得到进程地址空间中的绝对地址,这叫做地址加载时的动态重定向方式。

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

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

相关文章

结构型模式--1.适配器模式【托尼托尼·乔巴】

1. 翻译家 在海贼王中,托尼托尼乔巴(Tony Tony Chopper)是草帽海贼团的船医,它本来是一头驯鹿,但是误食了动物系人人果实之后可以变成人的形态。 乔巴吃了恶魔果实之后的战斗力暂且抛开不谈,说说它掌握的第…

[C++][算法基础]树的重心(树图DFS)

给定一颗树,树中包含 n 个结点(编号 1∼n)和 n−1 条无向边。 请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 重心定义:重心是指树中的一个结点,如果将这个点删除后&a…

PostgreSQL入门到实战-第十四弹

PostgreSQL入门到实战 PostgreSQL数据过滤(七)官网地址PostgreSQL概述PostgreSQL中BETWEEN 命令理论PostgreSQL中BETWEEN 命令实战更新计划 PostgreSQL数据过滤(七) BETWEEN运算符允许您检查值是否在值的范围内。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容…

嵌入式网线连接——笔记本电脑设置

一、需求 我们调试很多设备经常需要用到网线去调试,当然主流是USB,和网线。 二、笔记本电脑端设备 有网口的,非常方便,如果没有网口,则需要用到USB转网口 连接指示灯: 绿色:灯亮表示连接正常…

风险评估在应对网络安全威胁中扮演着重要的角色

如今,IT 安全专家面临各种重大威胁,从勒索软件、网络钓鱼,到对基础设施的攻击,再到对知识产权、客户数据的窃取;从不安全的供应链合作伙伴,再到组织内部人员的恶意行为。同时,随着云计算、远程工…

顺序存储结构的读取、插入与删除

顺序线性表--L已经存在&#xff0c;且1 < index < ListLength(L) 一、获得元素操作--GetElem 含义&#xff1a;将线性表L中的第 index 个位置元素值返回 思路&#xff1a;只要 index 的数值在数组下标值范围内&#xff0c;把数组第 index-1下标的值返回即可 二、插入…

从零开始做自动驾驶定位(十三)_ 关于建图的讨论

从零开始做自动驾驶定位(十三): 关于建图的讨论 配套代码和测试数据&#xff1a;联系作者获取 附赠自动驾驶学习资料和量产经验&#xff1a;链接 代码在后续可能会有调整&#xff0c;如和文章有出入&#xff0c;以实际代码为准 系列文章进行到这里&#xff0c;建图部分算是基…

详细分析Vuex中的mapGetters

目录 1. 基本知识2. Demo13. Demo2 1. 基本知识 优势和用途 简化代码&#xff1a;用 mapGetters 和 mapState&#xff0c;可以简化组件中对于 Vuex 中状态和 getter 的映射工作&#xff0c;减少了重复的代码书写更易读&#xff1a;组件中直接使用映射的计算属性&#xff0c;使…

CSS设置文本

目录 概述&#xff1a; text-aling: text-decoration: text-transform: text-indent: line-height: letter-spacing: word-spacing: text-shadow: vertical-align: white-space: direction: 概述&#xff1a; 在CSS中我们可以设置文本的属性&#xff0c;就像Word文…

20 Games101 - 笔记 - 光场、颜色与感知

**20 ** 光场、颜色与感知 光场 眼睛成像 眼睛成像&#xff1a;我们看到这个三维世界&#xff0c;在眼睛里类似就是一幅二维的图。如果直接看到一幅记录了看到的光线信息的图&#xff0c;也能得到同样效果&#xff08;虚拟现实&#xff09;。 全光函数 全光函数可以描述…

Jupyter Notbook如何安装配置并结合内网穿透实现无公网IP远程连接使用

文章目录 推荐1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…

java swing个人财务收支管理系统eclipse开发Mysql数据库CS结构java编程

一、源码特点 java swing 个人财务收支管理系统 是一套完善的窗体设计系统&#xff0c;对理解SWING java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;&#xff0c;系统主要采用C/S模式开发。 应用技术&#xff1a;javamysql 开发工具&#xf…

web APIs总结(1)

1. 根据CSS选择器来获取DOM元素 (重点&#xff09; 获取一个DOM元素我们使用谁&#xff1f;能直接操作修改吗&#xff1f;querySelector() 可以返回值&#xff1a;CSS选择器匹配的第一个元素,一个 HTMLElement对象。如果没有匹配到&#xff0c;则返null 获取多个DOM元素我们使…

有时导数据代码比写SQL要快很多

一、背景 接到一个数据需求&#xff0c;是从我们的Mongo中导出的&#xff0c;但要取的值得到很深的层级&#xff0c;尝试写了半天Mongo的查询查不出来&#xff0c;问了半天大模型给的也不对&#xff0c;于是考虑写代码的方式 二、数据格式 // 1 {"_id": ObjectId(&…

考研数学|张宇《1000题》做不下来怎么办?

不要害怕,你绝对可以做下来&#xff01; 1000题分为基础题和难题&#xff0c;基础题做题来还好&#xff0c;但是难题就有点偏和怪了&#xff0c;这是大部分考研人对于1000题的一致评价。 我觉得你可以这么做&#xff1a; 基础阶段可以做1000里面比较基础&#xff0c;简单的题…

ReLU Strikes Back: Exploiting Activation Sparsity in Large Language Models

iclr 2024 oral reviewer 评分 688 1 intro 目前LLM社区中通常使用GELU和SiLU来作为替代激活函数&#xff0c;它们在某些情况下可以提高LLM的预测准确率 但从节省模型计算量的角度考虑&#xff0c;论文认为经典的ReLU函数对模型收敛和性能的影响可以忽略不计&#xff0c;同时…

SAP SD学习笔记03 - SD模块中的主数据

上一章讲了SD中的组织单位和SD的简单流程。 SAP SD学习笔记02 - 销售流程中的组织单位-CSDN博客 SAP SD学习笔记01 - 简单走一遍SD的流程&#xff1a;受注&#xff0c;出荷&#xff0c;请求-CSDN博客 这一章讲SD中的主数据&#xff1a; - 得意先Master&#xff08;客户&…

LeetCode404:左叶子之和

题目描述 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 代码 class Solution { public:int getLeftSum(TreeNode* node, int& sum) {if (node nullptr || (node->leftnullptr &&node->rightnullptr)) return 0;if (node->left) getLeftS…

企业营销线索溯源:拒绝合规风险!

天眼销的线索溯源功能已经上线一段时间了。 溯源功能主要是查找从天眼销下载的企业营销线索的来源&#xff0c;通过输入相应的数据&#xff0c;就能查到该营销线索的来源网站。 虽然我们在所有的宣传介绍都表明我们的数据都是从公开渠道获取的&#xff0c;但是还是有很多用户会…

electron的webview和内嵌网页如何通信

在 Electron 的世界里&#xff0c;webview 标签相当于一个小盒子&#xff0c;里面可以装一个完整的网页&#xff0c;就像一个迷你浏览器。当你想和这个小盒子里的内容说话时&#xff08;也就是进行通信&#xff09;&#xff0c;这里有几个方法可以帮你做到&#xff1a; 这里只写…