ELF加载,进程地址空间与可执行程序的关系

1,可执行程序的格式

粗略概况

操作系统要如何认识可执行程序?我们的可执行程序是有格式的:

用指令size 加可执行程序名:

其中test就是代码块,data就是数据块,不仅可执行程序有格式,动态库,静态库也有格式,他们的格式有一个统一的命名叫做ELF,我在网上找了一些关于ELF的结构图:

其中先讲中间黄色这一段section,我们称之为节,用来分别存放不同属性的内容,其中在size看到的多个属性中,就分别是里面的某个节。

我们知道,程序编译的过程就算先编译成.o文件,再链接最后形成可执行程序,宏观上的流程就是:将不同文件中相同属性的section合并在一起形成可执行程序:

这就是为什么在实现函数的时候不能出现同名函数的原因,要是在合并的时候发现命名冲突了就不知道该听谁的了。

elfheader

用指令readelf -h 加可执行程序或.o文件就可查看:

可以发现,里面存的都是一些类似指示文件内容的东西。

Program Header Tableoptional

这一行存的是elf的整体布局,查看指令为readdlf -l 加名字

其中可以看到左边的LOAD区域,这部分地区就算存放代码段和数据段的。

前面学了inode与磁盘我们知道,对于任何一个文件,文件的内容就算一个巨大的“一维数组“,标识文件任何一个区域就等于偏移量加大小的方式

这也就是os寻找程序的方法,所以在readelf -l中,

LOAD区域可以看到有两段区间,就是偏移量加大小的方式来寻址。

如何查看表中更细节的信息?

指令:readelf -f  +名字可以查看:

左边【】中数字代表多少节,可以在其中找到对应的data,bss等:

2,重谈地址空间与可执行程序,加载的话题

1,可执行程序有没有地址的存在?

有!

可以通过反汇编的形式看到!

指令:objdump -S +名字:

可以看到红色框起来的部分,这就是每个指令的地址,在其中还可以找到section/.test等字段,也可以找到自己完成的函数名:

这就是存在磁盘中未运行的地址,我们叫他为逻辑地址,逻辑地址=起始地址+偏移量,其中区间为全零到全f

那么我们看到为什么main函数不是从零开始?

因为main函数上面还有一些指令,同时我们知道了指令也是有长度的,因为地址等于偏移量加长度,下一个地址减去上一个地址的值就是这条指令的大小。

所以在逻辑上我们找到第一个地址就可以找到全部地址,

地址+长度=下一个地址

而且这个事实还让我们知道,ELF在没加载到内存的时候就已经按【000,FFF】进行编址了,这就是虚拟地址!

编译器在编译的时候就已经形成虚拟地址了,所以磁盘的逻辑地址等于内存的虚拟地址

2,mm_struct由谁来初始化?

mm_struct中正文,初始化数据,未初始化数据都是由可执行程序中的各个数据节初始化而来

其中,readelf -h中的entry point address中记录着虚拟地址从哪里开始,是整个可执行程序的入口,放到cpu中的pc寄存器才可以运行,这也解释了os是怎么找到可执行程序从哪里开始的。

3,cpu与进程地址空间与物理内存的关系

问,cpu中pc执行程序的时候,使用的是什么地址?

虚拟地址!我们cpu也被骗啦

当可执行程序加载到内存中的时候,在物理内存中也有自己的地址:

其中在框外面的是物理地址,在框里面的是虚拟地址和指令,这时页表左侧就以框内虚拟地址初始化,页表右侧就以物理地址做初始化:

这个时候 ,可以认识cpu中两个东西,一个是CR3,一个是MMU硬件,CR3是用来存放页表的物理地址,MMU硬件可以读取物理内存中的指令,这时CR3+MMU就等于一个查表工具,并将查到的指令给到EIP寄存器中执行指令,当执行完时pc指针加加,这时就完成了程序运行过程的闭环:

、所以虚拟地址是操作系统,cpu,编译器共同协作下的产物,同时可以实现各个进程的独立性。

所以为什么要有·虚拟地址和虚拟地址空间?

编译器在编译的时候就不用考虑虚拟地址的情况了

在mm_struct中,还有一个vm_area_struct结构体,以链表的形式管理起来,里面由start和end来标记正文,栈,堆区,共享区等偏移量地址,用来定位代码或数据的位置。

4,动态库加载的理解

刚刚讲过的·vm_area_struc结构体中,有一个libso的int ret_count的引用计数,当lib加载进os时此libso的引用计数加加,然后将库函数映射到共享区中,与正文区的代码进行替换,正文会call物理内存,将映射过来的地址覆盖到正文代码中。

但是,正文去的代码不是只读的吗?

这时,elf中有一个节中的GOT可以解决,当我们发生库函数替换的时候,只需要把got映射到内存中的位置替换成虚拟地址位置就可以了,正文区会通过got表,找到对应的共享区。所以对地址重定位时,就改got表就行了。

同时,got属于进程自己的东西,所以可以做到重定位与地址无关

其中,我们可以通过readelf -S 看到got:

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

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

相关文章

超实惠的租借服务器训练深度学习方法

1. 必备软件 1.1 Xftp和Xshell 通过百度网盘分享的文件:Niha 链接:https://pan.baidu.com/s/1uHLme7H9SL2C-ZhFr107gA?pwdnadb 提取码:nadb xftp用于连接服务器, 传输本地文件到服务器上面去。 xshell用于连接服务器进行命令操作 2 恒源…

蓝桥杯-网络安全比赛题目-遗漏的压缩包

小蓝同学给你发来了他自己开发的网站链接, 他说他故意留下了一个压缩包文件,里面有网站的源代码, 他想考验一下你的网络安全技能。 (点击“下发赛题”后,你将得到一个http链接。如果该链接自动跳转到https,…

MongoDB笔记03-MongoDB索引

文章目录 一、前言1.1 概述1.2 MongoDB索引使用B-Tree还是BTree?1.3 B 树和 B 树的对比1.4 总结 二、索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引 三、索引的管理操作3.1 索引的查看3.2 索引的创建3.2.1 单字段索引3.2.2 复合索引 3.3 索引的移除3.3.1 指定索…

【Android】时区规则库tzdata更新

1 背景: 最近我遇到墨西哥城时区,会出现夏令时,而墨西哥城在2022年底都已经取消夏令时了。 看起来是要更新RK3588上的时区库,我的还是2021a,而现在都已经2024年了 这样能看版本号: cat /system/usr/sha…

网络初始:TCP/IP 五层协议模型 网络通信基本流程

目录 1. 名词解释 1.1 局域网 1.2 广域网 1.3 交换机 1.4 IP 地址 1.5 端口号 2. 协议 2.1 认识协议 2.2 五元组 3. 协议分层 3.1 分层的作用 3.2 OSI 七层网络模型 & TCP/IP 五层(四层)协议模型 4. TCP/IP 五层(四层)网络模型 4.1 物理层 4.2 数据链路层 4…

小新学习k8s第六天之pod详解

一、资源限制 Pod是k8s中的最小的资源管理组件,pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。k8s中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等…

安利一款超6K+ star的可拖放响应式灵活的网格布局Gridstack.js

Gridstack.js是一个现代JavaScript(或Typescript)库,旨在帮助开发人员快速构建交互式和响应式的布局。以下是对Gridstack.js的详细介绍: 一、主要特点 灵活的网格布局:Gridstack.js允许开发者轻松地创建和管理网格布局…

接口测试基础 --- 什么是接口测试及其测试流程?

接口测试是指针对软件系统的接口进行测试的过程,主要是验证系统之间的数据传输和通信是否正常、功能是否正确。接口测试主要关注接口的输入、输出以及相应的逻辑关系,而不关注底层实现细节。接口测试可以帮助开发团队发现和解决与接口相关的问题&#xf…

1分钟解决Excel打开CSV文件出现乱码问题

一、编码问题 1、不同编码格式 CSV 文件有多种编码格式,如 UTF - 8、UTF - 16、ANSI 等。如果 CSV 文件是 UTF - 8 编码,而 Excel 默认使用的是 ANSI 编码打开,就可能出现乱码。例如,许多从网络应用程序或非 Windows 系统生成的 …

python基础(1)

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:初识python,环境配置,编程基础以及数据类型_哔哩哔哩_bilibili 一、什么是python Python 是一种高级、解释型、通用编程语…

USB 设备数据安全管理解决方案

在当今数字化的办公环境中,USB 设备的广泛使用为企业和组织带来了便捷,但同时也隐藏着巨大的数据泄露风险。许多企业和机构都曾因 USB 设备使用不当而遭受严重损失。 一方面,员工可能会无意或有意地使用未经授权的 USB 设备接入公司网络。这…

【UE5】一种老派的假反射做法,可以用于移动端,或对反射的速度、清晰度有需求的地方

没想到大家这篇文章呼声还挺高 这篇文章是对它的详细实现,建议在阅读本篇之前,先浏览一下前面的文章,以便更好地理解和掌握内容。 这种老派的假反射技术,适合用于移动端或对反射效果的速度和清晰度有较高要求的场合。该技术通过一…

Flink滑动窗口(Sliding)中window和windowAll的区别

滑动窗口的使用,主要是计算,在reduce之前添加滑动窗口,设置好间隔和所统计的时间,然后再进行reduce计算数据即可。 窗口设置好时间间隔,和处理时间窗口的时间,比如将滑动窗口的时间间隔都设置为5s,处理时间…

基于YOLO11/v10/v8/v5深度学习的煤矿传送带异物检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Golang--文件操作

1、文件 文件:文件用于保存数据,是数据源的一种 os包下的File结构体封装了对文件的操作(记得包os包) 2、File结构体--打开文件和关闭文件 2.1 打开文件 打开文件,用于读取(函数): 传…

BSAchongsds、

一、 ## 统计基因组整体信息 srun -A 2022099 -p Debug -n 2 -N 1 seqkit stats ~/yiyaoran/workspace/06.BSRseq/guo_BSR_pipline/ref/genome.fasta > genome.allstatcat genome.allstat 文件名 格式 类型 序列数量 总长度 最小长度 平均长…

聊一聊Elasticsearch的基本原理与形成机制

1、搜索引擎的基本原理 通常搜索引擎包括:数据采集、文本分析、索引存储、搜索等模块,它们之间的协作流程如下图: 数据采集模块负责采集需要搜索的数据源。 文本分析模块是将结构化数据中的长文本切分成有实际意义的词,这样用户…

**AI的三大支柱:神经网络、大数据与GPU计算的崛起之路**

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Python | Leetcode Python题解之第542题01矩阵

题目: 题解: class Solution:def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:m, n len(matrix), len(matrix[0])# 初始化动态规划的数组,所有的距离值都设置为一个很大的数dist [[10**9] * n for _ in range(m)]…

RabbitMQ 管理平台(控制中心)的介绍

文章目录 一、RabbitMQ 管理平台整体介绍二、Overview 总览三、Connections 连接四、Channels 通道五、Exchanges 交换机六、Queues 队列查看队列详细信息查看队列的消息内容 七、Admin 用户给用户分配虚拟主机 一、RabbitMQ 管理平台整体介绍 RabbitMQ 管理平台内有六个模块&…