解析静态链接
文章目录
- 静态链接
- 空间与地址分配
- 相似段合并
- 虚拟地址分配
- 符号地址确定
- 符号解析与重定位
- 链接器优化
- 重复代码消除
- 函数链接级别
- 静态库
- 静态链接优缺点
静态链接
一组目标文件经过链接器链接后形成的文件即可执行文件,如果没有动态库的加入,那么这个可执行文件被加载后无需再进行重定位操作(符号已经在链接阶段全部得到重定位),这种方式即静态链接,静态链接的过程分为空间与地址分配+符号解析与重定位
空间与地址分配
空间与地址分配阶段链接器需要为各个节分配虚拟地址,分配虚拟地址的第一步就是要把各个目标文件的节进行合并,现代链接器都是采用相似段合并的方式对目标文件的节进行合并,所谓相似节合并,即多个目标文件的代码节合一起,数据节合一起…
相似段合并
链接器扫描所有目标文件各个节的信息,获取其长度,对相似节进行合并,合并完后的节在代码段中称为段。实际上ELF文件中既能称作节(section),也能称作段(segment),但是可执行文件中一般都是称为段,并且有个更专业的术语称为执行视图,而目标文件中的节称为链接视图
虚拟地址分配
//a.c
extern int shared;
int main(){int a=0;swap(&a,&shared);return 0;
}
//b.c
int shared=1;
void swap(int* a,int* b){*a^=*b=*a^=*b;
}
观察2个源文件的目标文件节信息
只需要关注红框选中的三个字段,size和file off为节的大小和在目标文件中偏移量,而VMA是虚拟地址,很明显0地址是无效的,它们其实都还没有被分配虚拟地址,这很正常,因为它们只是目标文件,是不能被执行的,也就没有必要分配什么虚拟地址了,但是由它们静态链接所产生的可执行文件具有有效的虚拟地址
合并后段大小不严格等于目标文件中对应的节大小之和是因为链接过程中还会添加一些额外信息
符号地址确定
目标文件中的各个符号都有相对于节起始位置的偏移量,这个偏移量很重要,符号地址的确定依赖它,对于一个符号来说,它在目标文件中的地址和在可执行文件中的地址是不一样的,链接后这些符号的绝对地址一定会发生变化,为了后续符号解析与重定位可以正常进行,就需要确定符号在可执行文件中的地址,如何确定就是通过这个不变的偏移量(符号地址再怎么变化,它相对于所在节的偏移量是始终不会发生改变的,链接器不会把一个节拆开)
符号解析与重定位
这一步是静态链接的核心步骤,基本上所有的链接错误都是发生在这个阶段,因为该阶段链接器的工作是确定外部符号引用的绝对地址,如果存在需要重定位但是找不到其定义的符号,就直接报错。
重定位工作之前,链接器必须知道可执行文件有哪些符号,哪些符号是需要被重定位的,因此链接器需要借助可执行文件中的全局符号表和全局重定位表,这2张表由是多个目标文件的符号表和重定位表合并而来的,因此可执行文件中的符号表和重定位表由第一步空间与地址分配完成
对于没有经过重定位的目标文件来说,那些外部符号的符号值是没有意义的
链接器将所有的外部符号进行重定位后
经过重定位后CPU就可以通过这个有效的操作数进行相对寻址正确的访问数据和执行函数
链接器优化
重复代码消除
//template.h
template<typename T>T add(T x,T y){return x+y;
}
//a.cc
int main(){add(1,2);return 0;
}
//b.cc
int ADD(int x,int y){return add(x,y);
}
C++中引入了模板,一个模板函数可能被多个源文件所实例化,这会造成重复的代码,例如a.cc和b.cc实例化出的函数都是int add(int,int),链接器会对其进行合并,减少不必要的空间浪费(可执行文件中的代码段只有一份int add(int,int))
更加专业的解释
- 编译器在每个翻译单元中生成模板函数的实例
- 链接器在链接这些对象文件时,会注意到多个相同的函数实例(例如 int add(int, int)),但不会报错,因为它会自动选择其中一个实例,忽略其他重复的实例(前提是定义在头文件中,这样编译器才能实例化)
- 这种行为是由C++标准规定的,称为“外部链接”的模板实例化
模板请不要声明和定义分离,这会造成链接错误
函数链接级别
目标文件中所定义的函数不一定在可执行文件中都会被使用,如果无脑地将所有函数全都放入可执行文件的代码段,这会造成无端的空间浪费,链接器引入了人函数链接级别的概念来优化,简单来说就是只把可执行文件中用到的函数写入可执行文件的代码段,不会用到的那些函数定义丢弃
静态库
静态库即一组目标文件的集合,Linux下通过ar命令对一组目标文件进行打包
ar -rc libmine.a a.o b.o
通过静态库链接可以简化命令行,链接器会在链接过程中从静态库中寻找所需要的数据或函数定义
gcc/g++在链接时默认采用动态链接,显示的静态链接需要添加-static选项
静态链接优缺点
优点
- 过程较为简单,一旦成功生成可执行文件后,就可以直接运行,并且不会有库依赖问题
缺点
- 可执行文件很大,因为静态链接的可执行文件将所有目标文件都进行合并;多个可执行文件可能静态链接了相同的库,但是它们运行时无法共享代码段(即使代码段是一样的),这会造成内存中存在多份一样的代码
- 升级维护困难,静态库的任何更新操作需要重新编译链接生成新的可执行文件
————————————————————————————————————
相关文章:

解析静态链接
文章目录 静态链接空间与地址分配相似段合并虚拟地址分配符号地址确定 符号解析与重定位链接器优化重复代码消除函数链接级别 静态库静态链接优缺点 静态链接 一组目标文件经过链接器链接后形成的文件即可执行文件,如果没有动态库的加入,那么这个可执行…...

前端基础-html-注册界面
(200粉啦,感谢大家的关注~ 一起加油吧~) 浅浅分享下作业,大佬轻喷~ 网页最终效果: 详细代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…...
量子电路的实现 基于ibm的qiskit
量子计算的物理实现 量子计算的实现有几种方式,最常用的就是超导量子计算机,它的量子处理器是用超导传输量子比特构建的,它是由一个约瑟夫森结和一个并联的电容器组成的电路。约瑟夫森结是一种非线性电感,由两层重叠的超导…...

关于谷歌浏览器debug模式不进断点问题解决方案
第一步.浏览器F12弹出调试者模式 第二步.点击设置齿轮,找到Ignore List,将node_model取消勾选,关闭浏览器,重新打开就进断点了...
制造行业实践|悠进电装基于超融合完成信息化改造, 保障业务系统 7/24 长跑
当一辆汽车在路上奔驰时,确保车内各种电气信号正常传递和电力供给的关键是什么?正是那不起眼却功不可没的汽车线束。这些精密编织的电线网络,犹如汽车的“神经网络”和“动脉血管”,在传递电气信号、数据的同时,源源不…...

如何学习C++游戏开发
学习C游戏开发是一个涉及多个领域的复杂过程,包括编程、游戏设计、图形学等。 1. **学习C基础**: - 掌握C的基本语法和面向对象编程。 - 学习C标准库,特别是STL(标准模板库)。 2. **理解游戏开发概念**…...

计算网络信号
题目描述: 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。注意:网络信号可以绕过阻隔物 array[m][n]的二维数组代表网格地图, array[i][j]0代表i行j列是空旷位置&…...
【Vue 全家桶】6、vue-router 路由(更新中)
目录 相关理解基本路由嵌套路由路由传参编程式路由导航 相关理解 基本路由 嵌套路由 路由传参 编程式路由导航...

解决程序因缺少xinput1_3.dll无法运行的有效方法,有效修复丢失xinput1_3.dll
如果你的电脑在运行某些应用程序或游戏时提示“xinput1_3.dll丢失”或“找不到xinput1_3.dll”的错误消息,那么很可能是因为你的系统中缺少这个重要的DLL文件而导致的问题。那么电脑出现xinput1_3.dll丢失的问题时有哪些方法进行修复呢? 如何确定电脑是否…...
uni-popup 弹出框
:maskClick"false" 是点击空白遮罩处不关闭弹窗 <uni-popup ref"popup" type"center" :maskClick"false"> <div style"width: 80vw;padding: 0.5em;box-sizing: border-box; background-color: #fff; border-…...
Android笔记:Android中Fragment改变主题
在Android中,Fragment使用主题可以通过以下几种方法实现: 1 在onCreateView方法中设置主题: 在onCreateView方法中,可以通过创建一个ContextThemeWrapper来改变Fragment的主题。例如: @Override public View onCreateView(LayoutInflater inflater, ViewGroup co…...
GEE 训练——利用sentinel-2数据计算两栖NDVI前后差异
目录 简介 函数 expression(expression, map) Arguments: Returns: Image 代码 结果 简介 利用sentinel-2数据计算两栖NDVI前后差异 COPERNICUS/S2是欧洲空间局(ESA)的地球观测计划,旨在通过卫星遥感技术提供全球的高分辨率地球观测数据。S2是COPERNICUS地球观测计…...

看电动缸是如何提高农机的自动化水平
电动缸作为一种将电动机的旋转运动转变为推杆的直线往复运动的电力驱动装置,在提升农机自动化水平方面发挥了重要作用。以下详细分析电动缸如何提高农机的自动化水平: 一、电动缸的工作原理与优势 电动缸的工作原理是以电力作为直接动力源,采…...
C++ 并发专题 - 条件变量的使用
一:概述: 在 C 中,条件变量(std::condition_variable)是一种用于线程间同步的机制,主要用于在多线程环境中让一个线程等待某个条件满足后再继续执行。条件变量通常配合互斥锁(std::mutex&#…...
《Essential C++》学习笔记
《Essential C》这本书,是适合从C选手快速过度到C选手的 一本书,下面是个人记录 第一章:基础语法 第一章主要就是C语言基础,这里类似于表达式 数组 条件语句 循环语句,就不多概述了。 :::info vector:可动…...
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
在当今的微服务架构蓬勃发展的时代,配置中心扮演着极为关键的角色,其重要性不言而喻。今天,我们就以 Apollo 为例,聊聊配置中心在微服务架构中的重要意义。 一、微服务架构下的配置管理挑战 随着微服务架构的广泛应用࿰…...

每日OJ题_牛客_春游_贪心+数学_C++_Java
目录 牛客_春游_贪心数学 题目解析 C代码 Java代码 牛客_春游_贪心数学 春游 描述: 盼望着,盼望着,东风来了,春天脚步近了。 值此大好春光,老师组织了同学们出去划船,划船项目收费如下:…...

JavaWeb--Maven
1.初始Maven 1.1介绍 Maven 是一款用于管理和构建Java项目的工具,是Apache旗下的一个开源项目 。 1.2Maven的作用 2.Maven概述 2.1Maven介绍 Apache Maven是一个项目管理和构建工具,它基于项目对象模型(Project Object Model , 简称: POM)的概念&am…...

计算机网络——网络层导论
转发是局部功能——数据平面 路由是全局的功能——控制平面 网卡 网卡,也称为网络适配器,是计算机硬件中的一种设备,主要负责在计算机和网络之间进行数据传输。 一、主要功能 1、数据传输: 发送数据时,网卡将计算机…...
使用 JPA 的 `save()` 方法更新数据库中的数据
在开发基于 JPA(Java Persistence API)的应用时,数据持久化操作中的常见问题是执行 save() 方法后数据库中的数据没有更新。本文将详细介绍 JPA 的 save() 方法如何工作、其可能出现的问题,以及如何解决这些问题,以确保…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...