当前位置: 首页 > news >正文

linux-----------------库制作与原理(下)

1.ELF文件

要理解编译链链接的细节,我们不得不了解⼀下ELF⽂件。其实有以下四种⽂件其实都是ELF⽂件:
可重定位⽂件(Relocatable File ) :即 xxx.o ⽂件。包含适合于与其他⽬标⽂件链接来创
建可执⾏⽂件或者共享⽬标⽂件的代码和数据。
可执⾏⽂件(Executable File ) :即可执⾏程序。
共享⽬标⽂件(Shared Object File ) :即 xxx.so⽂件。
内核转储(core dumps) ,存放当前进程的执⾏上下⽂,⽤于dump信号触发。
⼀个ELF⽂件由以下四部分组成:
ELF头 (ELF header) :描述⽂件的主要特性。其位于⽂件的开始位置,它的主要⽬的是定位⽂
件的其他部分。
程序头表(Program header table) :列举了所有有效的段(segments)和他们的属性。表⾥
记着每个段的开始的位置和位移(offset)、⻓度,毕竟这些段,都是紧密的放在⼆进制⽂件中,
需要段表的描述信息,才能把他们每个段分割开。
节头表(Section header table) :包含对节(sections)的描述。
节(Section ):ELF⽂件中的基本组成单位,包含了特定类型的数据。ELF⽂件的各种信息和
数据都存储在不同的节中,如代码节存储了可执⾏代码,数据节存储了全局变量和静态数据等。
最常⻅的节:
代码节(.text):⽤于保存机器指令,是程序的主要执⾏部分。
数据节(.data):保存已初始化的全局变量和局部静态变量。

2.ELF从形成到加载轮廓

2-1 ELF形成可执⾏

step-1:将多份 C/C++ 源代码,翻译成为⽬标 .o ⽂件
step-2:将多份 .o ⽂件section进⾏合并

2-2 ELF可执⾏⽂件加载

当用户执行一个ELF可执行文件时,操作系统通过加载器(Loader)动态链接器(Dynamic Linker)协作完成内存映射、权限设置、依赖解析等关键操作

⼀个ELF会有多种不同的Section,在加载到内存的时候,也会进⾏Section合并,形成segment
合并原则:相同属性,⽐如:可读,可写,可执⾏,需要加载时申请空间等.
这样,即便是不同的Section,在加载到内存中,可能会以segment的形式,加载到⼀起
很显然,这个合并⼯作也已经在形成ELF的时候,合并⽅式已经确定了,具体合并原则被记录在了
ELF的 程序头表 (Program header table)

注意:为什么要讲section合并成segment

Section合并的主要原因是为了减少⻚⾯碎⽚,提⾼内存使⽤效率。如果不进⾏合并,
假设⻚⾯⼤⼩为4096字节(内存块基本⼤⼩,加载,管理的基本单位),如果.text部分
为4097字节,.init部分为512字节,那么它们将占⽤3个⻚⾯,⽽合并后,它们只需2个
⻚⾯。
此外,操作系统在加载程序时,会将具有相同属性的section合并成⼀个⼤的
segment,这样就可以实现不同的访问权限,从⽽优化内存管理和权限访问控制

3.理解连接与加载

3-1 静态链接

无论是自己的.o文件还是静态库中的.o文件本质都是把.o文件进行链接的过程所以静态链接就是研究静态链接的过程

3-2静态链接的核心流程

  1. 输入文件准备

    • 目标文件:由编译器生成的.o文件,包含代码、数据及未解析的符号引用。

    • 静态库:通过ar工具打包的.a文件,本质是多个.o文件的集合(如libmath.a包含sin.ocos.o等)。

  2. 符号解析(Symbol Resolution)

    • 符号表合并:链接器遍历所有输入文件,构建全局符号表。

    • 处理未定义符号:若同一符号被多文件定义(如两个.o文件均定义global_var),触发重复定义错误

  3. 重定位(Relocation)

    • 地址分配:为所有节(Section)分配运行时内存地址(如.text0x400000开始)。

    • 修正引用:根据最终地址,修改代码中的相对偏移或绝对地址。

      复制

      下载

      // 目标文件中的未重定位指令(假设函数add的地址未确定)  
      call 0x00000000  // 占位符,链接时替换为add的实际地址  
  4. 生成可执行文件

    • 合并所有目标文件的.text.data等节到统一Segment。

    • 生成程序头表(Program Header)供加载器使用。

3-3ELF加载与进程地址空间

3-2-1 虚拟地址/逻辑地址

思考一下一个进程在没有加载到内存的时候它有没有地址呢?

⼀个ELF程序,在没有被加载到内存的时候,本来就有地址,当代计算机⼯作的时候,都采⽤"平坦
模式"进⾏⼯作。所以也要求ELF对⾃⼰的代码和数据进⾏统⼀编址,下⾯是 objdump -S 反汇编
之后的代码

3-4动态链接与动态库加载

进程是如何链接到库的呢
进程间是如何共享库的呢
我们可以思考一下在库加载到内存的时候我们在创建每一个进程的时候是否要给每个进程的重新加载一个库大家可以思考一下
我们是如何跟库具体映射起来的呢看一张图就明白了
总结
静态链接的出现,提⾼了程序的模块化⽔平。对于⼀个⼤的项⽬,不同的⼈可以独⽴地测试和开发
⾃⼰的模块。通过静态链接,⽣成最终的可执⾏⽂件。
我们知道静态链接会将编译产⽣的所有⽬标⽂件,和⽤到的各种库合并成⼀个独⽴的可执⾏⽂件,
其中我们会去修正模块间函数的跳转地址,也被叫做编译重定位(也叫做静态重定位)。
⽽动态链接实际上将链接的整个过程推迟到了程序加载的时候。⽐如我们去运⾏⼀个程序,操作系
统会⾸先将程序的数据代码连同它⽤到的⼀系列动态库先加载到内存,其中每个动态库的加载地址
都是不固定的,但是⽆论加载到什么地⽅,都要映射到进程对应的地址空间,然后通过.GOT⽅式进 ⾏调⽤(运⾏重定位,也叫做动态地址重定位)。

相关文章:

linux-----------------库制作与原理(下)

1.ELF文件 要理解编译链链接的细节,我们不得不了解⼀下ELF⽂件。其实有以下四种⽂件其实都是ELF⽂件: • 可重定位⽂件(Relocatable File ) :即 xxx.o ⽂件。包含适合于与其他⽬标⽂件链接来创 建可执⾏⽂件或者共享…...

一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting

一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting 文章目录 一种开源的高斯泼溅实现库——gsplat: An Open-Source Library for Gaussian Splatting摘要Abstract1. 基本思想1.1 设计1.2 特点 2. Nerfstudio&Splatfacto2.1 Nerfstudio2.…...

Embedding 模型详解:架构、训练与 LLM 的区别

1. 什么是 Embedding 模型? Embedding 模型的核心使命是将离散的、高维的文本数据(例如单个词语、短语、句子、段落乃至整篇文档)转化为稠密的 (dense)、低维的 (low-dimensional)、连续的 (continuous) 向量表示。这些向量被称作“嵌入 (Em…...

网络的知识的一些概念

1.什么是局域网,什么是广域网 局域网(Local area network)也可以称为本地网,内网,局域网有这几个发展经历: 最开始电脑与电之间是直接用网线连接的 再后来有了集线器() 再后来出…...

NAT(网络地址转换)逻辑图解+实验详解

原理 NAT(Network Address Translation,网络地址转换) 是一种网络技术,用于在IP数据包通过路由器或防火墙时,修改其源IP地址或目标IP地址,以实现不同网络之间的通信。 基础概念 本来NAT是来解决 IPv4 地…...

深入解析Spring Boot与Kafka集成:构建高性能消息驱动应用

深入解析Spring Boot与Kafka集成:构建高性能消息驱动应用 引言 在现代分布式系统中,消息队列是实现异步通信和解耦的重要组件。Apache Kafka作为一种高性能、分布式的消息系统,被广泛应用于大数据和实时数据处理场景。本文将详细介绍如何在…...

Linux的内存泄漏问题及排查方法

内存泄漏是指在计算机程序中,已不再被使用的内存未被正确释放,导致内存占用随时间累积,进而引发系统内存不足、性能下降甚至崩溃的问题。在Linux系统中,开发者和运维人员可通过以下方法排查和解决内存泄漏问题: 1. 使…...

Java基础知识总结(超详细整理)

一:概述 1.1Java类及类的成员 属性、方法、构造器、代码块、内部类 (1)数组 java虚拟机内存划分 各区域作用 内存解析 基本使用 两个变量指向一个一维数组 没有new就不会在堆里新开辟空间 (2)对象数组 (3&a…...

Qt Widgets模块功能详细说明,基本控件:QPushButton(二)

一、基本控件(Widgets) Qt 提供了丰富的基本控件,如按钮、标签、文本框、复选框、单选按钮、列表框、组合框、菜单、工具栏等。 1、QPushButton 1.1、概述 (用途、继承关系) QPushButton 是 Qt 框架中用于创建按钮的控件,它的主…...

【MySQL成神之路】MySQL常见命令汇总

目录 MySQL常用命令总结 1. 数据库操作 2. 表操作 3. 数据操作(DML) 4. 索引与优化 5. 用户与权限管理 6. 备份与恢复 7. 事务控制 8. 常用函数 9. 系统状态与日志 总结 MySQL常用命令总结 MySQL作为最流行的关系型数据库之一,提供…...

UnLua源码分析(一)初始化流程

UnLua源码分析(一)初始化流程 接入插件启动注册设置默认参数集注册回调SetActivePostLoadMapWithWorldULuaEnvLocator启动Lua虚拟机初始化UE相关的Lua Lib创建与Lua交互的数据结构注册静态导出的类,函数,枚举Lua层初始化 UUnLuaMa…...

非线性1 修改

第一章为读者介绍了非线性动力学与混沌理论的基本概念、发展历史以及应用领域。 1.1 动力学简史: 从牛顿力学开始,介绍动力学作为物理学分支的发展历程。重点介绍了庞加莱对混沌现象的早期探索,以及20世纪60年代洛伦兹方程的发现&#xff0…...

系统性能不达标,如何提升用户体验?

当系统性能不达标时,要想有效提升用户体验,必须从性能优化、前后端协同、用户感知改善、监控预警机制四个关键维度切入。其中,性能优化是最直接有效的策略,它通过代码优化、资源压缩、缓存机制、CDN加速等手段,显著提升…...

【Linux】进程的基本概念

目录 概念描述进程-PCB如何查看进程通过系统目录进行查看通过ps指令进行查看 通过系统调用获取进程的PID和PPID(进程标⽰符)通过系统调用创建子进程通过一段代码来介绍fork为什么要有子进程?fork为什么给子进程返回0,给父进程返回子进程的PIDfork函数到底…...

mongodb管理工具的使用

环境: 远程服务器的操作系统:centOS stream 9; mongoDB version:8.0; 本地电脑 navicat premium 17.2 ; 宝塔上安装了mongoDB 目的:通过本地的navicat链接mongoDB,如何打通链接,分2步: 第一步:宝塔-&…...

面试中的线程题

原文链接:线程题大全 Java 并发库同步辅助类 CountDownLatch 工作机制:初始化一个计数器,此计数器的值表示需要等待的事件数量。 提供了两个主要方法: await():当一个线程调用此方法时,它将阻塞&#…...

计算机系统的层次结构

计算机系统的层次结构 一, 计算机系统的层次结构的定义 计算机的一个赢软件组成的综合体. 因为面对的应用范围越来越广, 所以必须有复杂的系统软件和硬件的支持. 软/硬件的设计者和使用者从不同的角度, 不同的语言来对待同一个计算机系统, 因此他们看到的计算机系统的属性对计…...

[特殊字符] SSL/TLS 中的密钥协商流程笔记

✅ 背景说明: SSL/TLS 为了确保通信保密性,结合使用了: 非对称加密(用于密钥交换) 对称加密(用于数据加密) 🔁 客户端主导密钥协商的完整流程如下: 1️⃣ 客户端发起…...

多模态大语言模型arxiv论文略读(八十一)

What is the Visual Cognition Gap between Humans and Multimodal LLMs? ➡️ 论文标题:What is the Visual Cognition Gap between Humans and Multimodal LLMs? ➡️ 论文作者:Xu Cao, Bolin Lai, Wenqian Ye, Yunsheng Ma, Joerg Heintz, Jintai …...

SpringBoot(一)--- Maven基础

目录 前言 一、初始Maven 1.依赖管理 2.项目构建 3.统一项目结构 二、IDEA集成Maven 1.Maven安装 2.创建Maven项目 2.1全局设置 2.2 创建SpringBoot项目 2.3 常见问题 三、单元测试 1.JUnit入门 2.断言 前言 Maven 是一款用于管理和构建Java项目的工具&#xff…...

如何使用WordPress创建美食博客

不管你是否意识到,食物是我们生活的核心。有些人将其用作燃料,而另一些人则将食谱作为一种艺术形式呈现。如果您属于后者,并且想创建一个美食博客来分享您的热情,那么WordPress是一个顶级平台。 几乎每个话题都有一个博客利基&am…...

SAP集团内部公司间交易自动开票

SAP集团内部公司间交易自动开票(非STO/EDI模式) 集团内部公司间采购与销售业务,在确认相应单据无误后,为减少人工开票业务, 可以用系统标准功能来实现自动开票。 1.采购发票自动开票(ERS) T-CODE:BP,勾选“基于收货的发票校验”、“自动G…...

代码审计-php框架开发,实战tp项目,打击微交易,源码获取,扩大战果

实战,不安全写法引发的注入 这个bc靶场源码没有,看老师演示 打开很明显的tp框架源码 拿到tp框架之后第一步,搜索版本信息5.0.5 两个思路 1.代码的不安全写法 2.版本自身存在的漏洞 全局搜索where看看也没有不安全的 哎?&…...

Atcoder Beginner Contest 406

比赛链接&#xff1a;ABC406 A - Not Acceptable 将小时转换成分钟直接进行判断。 时间复杂度&#xff1a; O ( 1 ) O(1) O(1)。 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);int a,…...

02 K8s双主安装

00 前提准备 # 设置好主机名并添加hosts解析主机名IP地址身份master01172.2.25.50主Mastermaster02172.2.25.51备Masternode01172.2.25.52节点1node02172.2.25.53节点2node03172.2.25.54节点3 01 使用脚本安装Docker # Docker脚本文件 https://node-siyuan.oss-cn-beijing.a…...

分别用 语言模型雏形N-Gram 和 文本表示BoW词袋 来实现文本情绪分类

语言模型的雏形 N-Gram 和简单文本表示 Bag-of-Words 语言表示模型简介 (1) Bag-of-Words (BoW) 是什么&#xff1f; *定义&#xff1a;将文本表示为词频向量&#xff0c;忽略词序和语法&#xff0c;仅记录每个词的出现次数。 **示例&#xff1a; 句子1&#xff1a;I love …...

2_Spring【IOC容器中获取组件Bean】

Spring中IOC容器中获取组件Bean 实体类 //接口 public interface TestDemo {public void doSomething(); } // 实现类 public class HappyComponent implements TestDemo {public void doSomething() {System.out.println("HappyComponent is doing something...")…...

一次页面假死分析

现象&#xff1a;系统的几个功能若干次切换&#xff0c;页面假死&#xff0c;无反应 上图&#xff0c;不是每次切换都假死&#xff0c;但非常容易重现&#xff0c;每次页面假死都在getValidatorJSONInfo这个调用后 getValidatorJSONInfo调用已返回&#xff0c;但返回内容页面挂…...

WPS多级标题编号以及样式控制

WPS多级标题编号以及样式控制 上一篇&#xff1a;WPS自动生成图表目录以及样式控制 阅读提示&#xff1a;请先阅读完本篇内容再操作&#xff0c;避免出现其他错误。 初始样式&#xff1a; 1.1 步骤演示 说明&#xff1a;以3级目录为例 标题1样式&#xff1a;黑体&#xff0c;…...

方差是什么?

一、方差是什么? 方差(Variance)是概率论和统计学中衡量数据离散程度(即数据与平均值的偏离程度)的核心指标。 通俗理解:方差越大,数据越“分散”“波动大”;方差越小,数据越“集中”“稳定”。 二、方差的公式(以样本数据为例) 计算步骤: 第一步:求平均值 ( …...

Java核心API实战:从字符串到多线程全解析

Java常用API详解与代码实践 一、字符串处理类 1. String类 // 字符串基础操作 String str "Hello,Java!"; System.out.println(str.substring(7)); // 输出"Java!" System.out.println(str.indexOf("Java")); // 输出7// 正则表达式匹配 Str…...

低代码AI开发新趋势:Dify平台化开发实战

在人工智能快速发展的今天&#xff0c;AI应用的开发方式也在不断演变。从传统的手写代码到如今的低代码甚至零代码开发&#xff0c;技术的进步让更多的非专业开发者也能轻松上手。本文将带你走进Dify平台化开发的世界&#xff0c;探索如何通过这一强大的低代码AI开发平台&#…...

基于First Order Motion与TTS的AI虚拟主播系统全流程实现教程

前言&#xff1a;多模态虚拟主播的技术革命 在AI内容生成领域&#xff0c;虚拟主播技术正经历从2D到3D、从固定模板到个性化定制的跨越式发展。本文将深入解析如何通过Python技术栈构建支持形象定制与声音克隆的AI虚拟主播系统&#xff0c;涵盖从人脸建模到多模态融合的全流程…...

中科院自动化研究所通用空中任务无人机!基于大模型的通用任务执行与自主飞行

作者&#xff1a; Ji Zhao and Xiao Lin 单位&#xff1a;中科院自动化研究所 论文标题&#xff1a;General-Purpose Aerial Intelligent Agents Empowered by Large Language Models 论文链接&#xff1a;https://arxiv.org/pdf/2503.08302 主要贡献 硬件-软件协同设计框…...

DOM知识点

DOM&#xff08;Document Object Model&#xff09;即文档对象模型&#xff0c;是用于表示和操作HTML、XML文档的编程接口。以下是关于DOM的一些知识点总结&#xff1a; 基本概念 • DOM将文档解析为一个由节点&#xff08;Node&#xff09;组成的树形结构&#xff0c;每个节…...

设备预测性维护的停机时间革命:中讯烛龙如何用AI重构工业设备管理范式

在工业4.0的智能化浪潮中&#xff0c;非计划停机每年吞噬企业3%-8%的产值。中讯烛龙预测性维护系统通过多模态感知矩阵分布式智能体的创新架构&#xff0c;实现设备健康管理的范式跃迁&#xff0c;帮助制造企业将停机时间压缩70%以上。本文将深度解析技术实现路径与行业级实践方…...

JMeter 教程:使用 HTTP 请求的参数列表发送 POST 请求(form 表单格式)

目录 ✅ 教程目的 &#x1f6e0;️ 准备工作 &#x1f4c4; 操作步骤 第一步&#xff1a;新建测试计划 第二步&#xff1a;添加 HTTP 请求 第三步&#xff1a;添加参数列表&#xff08;表单参数&#xff09; 第四步&#xff1a;添加结果查看器 第五步&#xff1a;运行测…...

**HTTP/HTTPS基础** - URL结构(协议、域名、端口、路径、参数、锚点) - 请求方法(GET、POST) - 请求头/响应头 - 状态码含义

# HTTP/HTTPS基础知识点详解 ## 1. URL结构 ### 协议部分 - http:// - 超文本传输协议&#xff0c;明文传输 - https:// - 安全的超文本传输协议&#xff0c;使用SSL/TLS加密 - 爬虫注意点&#xff1a;HTTPS网站有TLS指纹(JA3指纹)&#xff0c;可被用于检测爬虫 ### 域名部分…...

2025抓包工具Reqable手机抓包HTTPS亲测简单好用-快速跑通

前言 自安卓7.0高版本系统不在信任用户证书&#xff0c;https抓包方式市面查找方法太过复杂手机要root等&#xff0c;前置条件要求太高太复杂&#xff0c;看的头痛&#xff0c;今天一台电脑按步骤操作完即可抓包https,给大家搞定抓包https问题。支持直接编辑修改请求参…...

大模型在胫骨平台骨折预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究方法和创新点 二、大模型预测胫骨平台骨折的原理和方法 2.1 相关大模型介绍 2.2 数据收集与预处理 2.3 模型训练与优化 2.4 模型评估指标 三、术前预测与手术方案制定 3.1 骨折类型和严重程度预测 3.…...

AI图像处理之ComfyUI节点(二)

一、Load Checkpoint节点 功能&#xff1a;用于加载预训练的大模型&#xff0c;如Stable Diffusion等 参数&#xff1a; chechkpoint&#xff1a;选择加载的模型文件&#xff08;.ckpt或.satetensors格式&#xff09; MODEL&#xff1a;输出用于图像扩散预测的UNet模型 CLIP&…...

异常日志规范

目录 一、错误码 二、异常处理 三、日志规约 一、错误码 强制&#xff1a; 1、错误码的制订原则&#xff1a;快速溯源、沟通标准化。 1&#xff09;错误码必须能够快速知晓错误来源&#xff0c;可快速判断是谁的问题。 2&#xff09;错误码必须能够清晰地比对&#xff08;…...

pycharm连接github(详细步骤)

【前提&#xff1a;菜鸟学习的记录过程&#xff0c;如果有不足之处&#xff0c;还请各位大佬大神们指教&#xff08;感谢&#xff09;】 1.先安装git 没有安装git的小伙伴&#xff0c;看上一篇安装git的文章。 安装git&#xff0c;2.49.0版本-CSDN博客 打开cmd&#xff08;…...

UESplineThicken节点

SplineThicken 函数用来使非常薄的多边形在渲染时显示为略厚。对于线缆、头发、草和其他此类对象&#xff0c;这种效果非常理想。 SplineThicken节点 该节点始终朝向摄像机 可以控制模型前后宽度 可以连接到wpo上制作特效效果 参考链接 https://dev.epicgames.com/document…...

【C++】map和set的使用

&#x1f4cc; 个人主页&#xff1a; 孙同学_ &#x1f527; 文章专栏&#xff1a;C &#x1f4a1; 关注我&#xff0c;分享经验&#xff0c;助你少走弯路 文章目录 1. 序列式容器和关联式容器1.1 序列式容器1.2 关联式容器 2. set系列的使用2.1 set和multiset的参考文档2.2 se…...

MCP实战:在扣子空间用扣子工作流MCP,一句话生成儿童故事rap视频

扣子最近迎来重要更新&#xff0c;支持将扣子工作流一键发布成MCP&#xff0c;在扣子空间里使用。 这个功能非常有用&#xff0c;因为我有很多业务工作流是在扣子平台上做的&#xff0c;两者打通之后&#xff0c;就可以在扣子空间里直接通过对话方式调用扣子工作流了&#xff0…...

c/c++的opencv直方图初识

C/C OpenCV中的图像直方图&#xff1a;零基础入门指南 &#x1f4ca; 大家好&#xff01;今天我们来聊聊图像处理中一个非常基础且重要的概念——直方图(Histogram)。如果你是OpenCV新手&#xff0c;或者对直方图感觉有点迷糊&#xff0c;别担心&#xff0c;这篇文章会用最简单…...

Spring Boot 与 RabbitMQ 的深度集成实践(一)

引言 ** 在当今的分布式系统架构中&#xff0c;随着业务复杂度的不断提升以及系统规模的持续扩张&#xff0c;如何实现系统组件之间高效、可靠的通信成为了关键问题。消息队列作为一种重要的中间件技术&#xff0c;应运而生并发挥着举足轻重的作用。 消息队列的核心价值在于其…...

Android动态音频柱状图可视化解析:从原理到实现

Android动态音频柱状图可视化解析:从原理到实现 一、整体架构设计二、核心组件设计三、核心代码实现四、交互设计与用户体验五、性能优化与问题解决一、整体架构设计 Android动态音频柱状图可视化解析 在移动应用开发中,音频可视化是增强用户体验的重要手段。无论是音乐播放器…...

vue3大事件项目

这周写完了vue3的大事件项目&#xff0c;从中学到了很多东西&#xff0c;并且解決了一部分bug&#xff0c;現在就和大家分享一下我遇到的问题并且是如何解決的 1. QuillEditor 的 v-model 用法错误 先讲一下quilleditor富文本的基本使用方法&#xff1a; 1.安裝quill依賴&am…...