目录

1.温故知新

2.ELF文件介绍

3.ELF文件组成

4.ELF文件形成到加载

5.连接过程


1.温故知新

        上一篇博客,我们介绍了我们的动静态,知道了我们的库其实也是文件,如果我们想写一个库也是可以的,我们的把我们的库文件编译成.o文件,然后把它们进行打包.a文件,形成静态库,然后我们把我们的程序和库进行打包编译,就把我们的静态库和我们的代码进行合并,我们就可以使用库的函数了。动态库需要我们把它的库文件放在我们的默认查找路径下/lib/64下,让我们可以找到我们的库文件就可以了,而至于我们的头文件,我们只需要让我们的文件找到它就可以了。

2.ELF文件介绍

首先我们知道ELF文件是什么?是文件啊。是文件就有内容和属性,了解它无非就是内容上了解,属性上了解。

       我们的.o文件,可执行程序,.so文件,core dump都是我们的ELF文件,所以我们想要进一步了解编译链接的细节就需要来了解我们的ELF文件。

3.ELF文件组成

        我们的ELF文件由四部分组成:ELF头,程序头表,节头表,节组成。

我们的ELF header里面定位文件的其他部分。ELF文件内容对我来讲,就是一个数组。

因为我只要知道他这个文件的起始位置和它们的大小,我们就可以找到这个文件的任意位置了。

ELF文件内容里面的四个部分。

                

我们内核里面ELF的代码是有这个程序的入口的,它位于我们文件的开始位置,可以定位文件的其他部分,它也有我们程序的入口,让我们编译器知道从程序的哪个位置开始执行。

4.ELF文件形成到加载

我们进行动静态库链接需要先把.c文件编译成.o文件,我们还需要对多个.o文件进行合并。

但是这个合并是在我们链接的时候进行的。我们做的是把我们.o库文件进行打包。

我们的ELF文件有多种不同的Section,在加载到内存的时候,也会进行Section的合并

我们的节头表在链接时起作用,节头表里面有对每个节的描述,链接的时候可以根据对节的描述把节进行合并成段,提高空间利用效率,而我们的程序头表里面列举了每个段的描述和属性,知道每个段在哪里分开,把每个段进行分开,这样可以帮助我们加载的时候告诉我们OS怎样加载可执行文件完成进程内存的初始化。

说白了就是节是具体的,告诉怎么合并,程序头表是告诉段的划分是怎么样的,让OS进行内存初始化。节头表是我们链接的时候,程序头表告诉我们怎么把我们链接好的文件放到内存里进行执行。

上面我们说过,我们ELF头可以帮助我们定位ELF文件每个部分,所以我们编译器只需要知道我们ELF节头表,就可以对节进行合并了,合并好了就链接好了啊。

当我们想要执行的时候我们的OS可以找到这个文件ELF头表,再根据头表找到程序头表,知道哪些模块要加载进内存。知道我们程序的加载。

所以我们上面说我们OS和编译器都要知道ELF头表因为我们链接时要用,加载时也要用。不知道

ELF怎么完成这个工作呢?

实践中,当我们将一个.c文件编译成我们的.o文件我们去查看我们的文件,发现我们文件中调库函数地方的地址是没有的。

这是因为我们只有函数的声明,我们还没有对我们的,o文件进行链接,找不到具体的实现方法,所以这里学习的是不是和我们以前介绍的对上了呢?因为没有链接,所以找不到具体的实现,但是头文件里面有我们函数的声明,所以并没有报错。

我们静态链接就是把我们的.o进行合并,链接合并的时候,链接器会根据我们的重定位表对函数的地址进行重定位从而形成我们的可执行文件。这就是静态链接的过程。

我们链接之后我们发现我们的函数地址就被填充上了,我们就可以找到对应的实现方法了。

所以链接在干什么?就是把我们不知道函数具体实现的地方找到了函数实现的地址,对地址实现了重定位。

这里我们终于知道了为什么.o叫做可重定位文件了,因为它需要重定位才可以执行,不然我们只有函数声明,没有函数实现,执行个毛!

两个.o代码合并到一起,进行统一的编制,链接的时候,修改.o中没有确定的函数地址,进行相关call地址,完成代码调用。

5.连接过程

事实上,我们对ELF进行编制,采用平坦模式进行编制,说白了就是从000-fff进行线性统一编制。

磁盘可执行文件,就是起始地址+偏移量这种地址,只不过我们平坦模式的起始地址是0.

我们给磁盘中这种文件编制的地址叫逻辑地址。它和我们加载到内存的虚拟地址是一样的。

如同一个硬币的两面,硬币翻面了还是那个硬币啊!

        

在我们的磁盘中,我们的文件就有了逻辑地址了,所以我们可以看到我们的文件还没有被加载到内存的时候,就已经被编制了,并不是加载到内存才有得地址。

而且我们的虚拟地址初始化的时候还需要依赖ELF文件,每个segment有自己的起始地址和结束地址,就可以用来初始化虚拟地址了。

根据下面这张图,我们来做一个总结,我们的ELF文件在我们的磁盘中的时候就有了虚拟地址了,然后当我们的可执行程序被加载到内存的时候,我们会拿到它的虚拟地址,在页表中为它建立映射关系,根据ELF合并之后的段对我们的虚拟地址空间进行初始化,也就是虚拟地址对物理内存映射的建立过程,然后我们就根据ELF文件提供的内容完成了我们可执行程序从硬盘加载到内存调用的过程了。

给到我们的虚拟地址,当我们调用我们的程序的时候,根据我们的MMU,我们就找到了物理内存的实际位置进行调用。

这里要说明的是,当我们建立虚拟和物理的映射关系时,不会立即在内存分配空间,而是当你调用的时候再为你分配空间。这个是我们缺页异常导致的,就好比我们fork一个子进程,只有当我们修改的时候我们才会写实拷贝,这是因为我们进行权限检查发现越界了,OS检查后对它进行了修改。类似!

我们下期再见!

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

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

相关文章

人工智能领域、图欧科技、IMYAI智能助手2025年6月更新月报

2025年6月AI领域重要模型更新与平台优化汇总 摘要: 本文汇总了2025年6月期间AI领域发布的多项重要模型更新及平台功能优化信息,涵盖Google Gemini、阿里通义万相、字节豆包、百度文心一言、MiniMax海螺02、Google Veo3、快手可灵2.1、FLUX Kontext等模型…

从零开始学Express,理解服务器,路由于中间件

当我们初学前端时,常常只关注页面效果和交互,但随着项目复杂度提升,我们迟早会遇到“服务端”的问题:如何让一个页面的数据是从数据库来的?怎么让不同的用户看到不同的内容?这时候,我们就需要一…

Codeforces Round 987 (Div. 2)

ABC 略D预处理出每个位置的前缀最大和后缀最小。从后向前枚举&#xff0c;如果一个数无法后移&#xff0c;那么答案就是最大前缀&#xff0c;否则答案要不是前缀最大&#xff0c;要不就是这个数先移到前缀最大位置再移到能移到的最大的位置此处的答案。用线段树维护#include<…

Javascript/ES6+/Typescript重点内容篇——手撕(待总结)

前端核心知识点梳理与面试题详解 1. Promise 核心知识点 Promise 是异步编程的解决方案&#xff0c;用于处理异步操作三种状态&#xff1a;pending&#xff08;进行中&#xff09;、fulfilled&#xff08;已成功&#xff09;、rejected&#xff08;已失败&#xff09;状态一旦改…

[自动化Adapt] 父子事件| 冗余过滤 | SQLite | SQLAlchemy | 会话工厂 | Alembic

第五章&#xff1a;事件处理与融合 欢迎回到OpenAdapt探索之旅~ 在第四章&#xff1a;系统配置中&#xff0c;我们掌握了如何定制化系统参数。更早的第一章&#xff1a;录制引擎则展示了系统如何捕获海量原始操作数据。 假设我们需要训练机器人输入"hello"一词。原…

组合期权:跨式策略

文章目录0.简介1.买入跨式组合&#xff08;Long Straddle&#xff09;1.1 适用场景​1.2 合约选择1.3 损益分析1.4 案例示范2.卖出跨式组合&#xff08;Short Straddle&#xff09;2.1 适用场景​2.2 合约选择2.3 损益分析2.4 案例示范3.小结参考文献0.简介 跨式策略是一种交易…

Vue计算属性详解2

可写计算属性 计算属性默认是只读的,但在特殊场景下,我们可以创建"可写"的计算属性,通过同时提供getter和setter实现: <script setup>import { ref, computed } from vueconst firstName = ref(John)const lastName = ref(Doe)const fullName = computed(…

UniStorm 5.3.0 + Unity2022 + URP配置说明

一、前言 以前我用的是UniStorm3.0&#xff0c;主要用在内置管线里面&#xff0c;最近想在URP管线里面使用UniStorm天气系统&#xff0c;于是弄了UniStorm5.3.0的包&#xff0c;在Unity2022.3的URP模式下配置&#xff0c;直接导入package&#xff0c;两次宣告失败。最后看了官方…

力扣经典算法篇-44-组合总和(回溯问题)

1、题干 给你一个无重复元素的整数数组candidates和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。…

矩阵与高斯消元:数学算法在计算机领域的应用

一、概述和基本概念 矩阵&#xff0c;类似于在 C 中我们看到的二维数组。它有两个维度&#xff0c;行和列。下面是一个典型的矩阵&#xff1a; M[12342345445610111213] M \begin{bmatrix} 1 & 2 & 3 & 4 \\ 2 & 3 & 4 & 5 \\ 4 & 4 & 5 &…

【补题】CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes!) D. K-good

题意&#xff1a;给一个n&#xff0c;如果能被k个数整除&#xff0c;要求这k个数%k后不相同&#xff0c;问如果可以&#xff0c;任意k是多少&#xff0c;如果不可以输出-1 思路&#xff1a; D. K-good_牛客博客 从来没见过&#xff0c;太诡异了&#xff0c;做题做少了 1.…

LLM推理框架的“权力的游戏”:vLLM之后的群雄逐鹿

既然我们已经深入探讨了本地与云端的两大代表Ollama和vLLM&#xff0c;是时候将视野拓宽&#xff0c;检视一下在高性能推理这片“高手如云”的竞技场中&#xff0c;还有哪些重量级的玩家。vLLM的出现点燃了战火&#xff0c;但远非终点。 欢迎来到LLM推理框架的“后vLLM时代”—…

TDengine IDMP 背后的技术三问:目录、标准与情景

过去十年&#xff0c;#工业 和#物联网 场景经历了快速的#数字化 建设&#xff1a;传感器接入、系统联网、数据上云……数据平台已能轻松承载每秒千万级别的写入&#xff0c;每天几 TB 的存储量。但今天再回头看&#xff0c;这些看似“完成”的系统&#xff0c;实际上只解决了一…

MyBatis基础操作完整指南

文章目录MyBatis简介环境搭建Maven依赖数据库表结构核心配置MyBatis配置文件数据库配置文件实体类基础CRUD操作Mapper接口Mapper XML映射文件工具类测试类动态SQL常用标签高级特性一对一关联映射一对多关联映射分页查询使用注解方式MyBatis简介 MyBatis是Apache的一个开源项目…

go与grpc

目录下载与安装遇到的问题cmd中protoc找不到命令cmd中--go_out: protoc-gen-go: Plugin failed with status code 1.下载与安装 下载protoc&#xff1a; https://github.com/protocolbuffers/protobuf/releases 点击下载相应电脑版本即可&#xff0c;我是windows系统下载了pro…

2025年AI面试重构招聘新生态

当企业面临业务扩张与人才竞争的双重压力&#xff0c;传统招聘模式已难以满足高效、精准、公平的人才筛选需求。尤其在校招季、蓝领用工潮等关键节点&#xff0c;面试官超负荷运转、跨地域协调困难、评估标准模糊等问题频发。AI技术的深度介入正推动招聘行业从“经验驱动”向“…

Rust进阶-part5-trait

Rust进阶[part5]_trait trait概述 在 Rust 中,trait 是一种定义共享行为的方式。它类似于其他语言中的接口,允许我们定义一组方法签名,然后让不同的类型去实现这些方法。通过 trait,我们可以实现多态性,即不同类型可以以统一的方式处理。 普通实现 使用 trait 关键字来…

【人工智能-18】机器学习:决策树、随机森林

上一期【人工智能-17】机器学习&#xff1a;KNN算法、模型选择和调优、朴素贝叶斯分类 文章目录一、决策树1.使用理由2.技术二、随机森林1.使用理由2.原理核心&#xff1a;Bagging 随机特征子集3.优点和缺点一、决策树 决策树是一种监督学习算法&#xff0c;主要用于分类&…

RFID高频读写器在工业生产线的使用优势

在工业4.0浪潮下&#xff0c;智能制造对生产效率与精准度的要求日益提升。RFID技术凭借其独特的技术优势&#xff0c;成为工业场景中实现数据实时采集与流程优化的关键工具。本文主要从RFID高频读写器出发&#xff0c;系统解析其在工业生产线中的使用优势。RFID高频读写器一、技…

大模型学习笔记

prompt 提示词的构成&#xff1a; 指示&#xff1a;描述让它做什么上下文&#xff1a;给出与任务相关的背景信息输入&#xff1a; 任务的输入信息输出&#xff1a;输出的格式 生成与检索 生成&#xff1a; 优点&#xff1a;内容的多样性、创造性缺点&#xff1a;存在不可控制 检…