程序员的自我修养(链接、装载与库)--摘录与汇总(一)

指令和地址分开原因:(P59

1、独立权限,防止程序指令非预期改写

程序装载后,数据和指令分别被映射到两个虚存区域。由于数据区域对于进程来说是可读写的,而指令区域对于进程来说是只读的,所以这两个虚存区域的权限可以被分别设置为可读写和只读。这样可以防止程序的指令被有意或者无意地改写。

2、提高 CPU 缓存命中率

指令区和数据区的分离有利于提高程序的局部性。

3、节省内存占用

等系统中运行着多个该程序的副本时,他们的指令都是一样的,所以内存中只需要保存一份该程序的指令部分。而每个副本进程的数据区域是不一样的,他们是进程私有的。

.bss 段和 .data 段 (P59、P65、P66、P111

  • .bss 段只是为“未初始化的全局变量和局部静态变量预留位置,它并没有内容,所以它在文件中不占据空间”
  • .data 段保存的是“已经初始化了的全局静态变量和局部静态变量

注:有些编译器会将全局的未初始化变量存放在目标文件的.bss 段,有些则不存放,只是预留一个未定义的全局变量符号,等到最终链接成可执行文件的时候再在.bss 段分配空间。原则上讲,我们可以简单地把它当做全局未初始化变量存放在.bss段。值得一提的是编译单元内部可见的静态变量的确是存放在.bss 段的

原因:

1、“未初始化的全局变量”在目标文件中并未放到 .bss 段中,而是标记为一个 COMMON 类型的变量,这是因为“未初始化的全局变量”是一个弱符号,其最终占用的大小未知,所以编译器此时无法为该弱符号在 BSS 段分配空间
,也即不能放在 .bss 段中,而链接器在链接过程中就能确定弱符号的大小了,所以“未初始化的全局变量”可以放在最终输出文件的 .bss 段中

现在我们再回头总结性地思考关于未初始化的全局变量的问题:在目标文件中,编译器
为什么不直接把未初始化的全局变量也当作未初始化的局部静态变量一样处理,为它在 BSS
段分配空间,而是将其标记为一个 COMMON 类型的变量?
通过了解链接器处理多个弱符号的过程,我们可以想到,当编译器将一个编译单元编译
成目标文件的时候,如果该编译单元包含了弱符号(末初始化的全局变量就是典型的弱符
号),那么该弱符号最终所占空间的大小在此时是未知的,因为有可能其他编译单元中该符
号所占的空间比本编译单元该符号所占的空问要大。所以编译器此时无法为该弱符号在 BSS
段分配空间,因为所须要空间的大小末知。但是链接器在链接过程中可以确定弱符号的大小,
因为当链接器读取所有输入目标文件以后,任何一个弱符号的最终大小都可以确定了,所以
它可以在最终输出文件的 BSS 段为其分配空间。所以总体米看,未初始化全局变量最终还
是被放在 BSS 段的。
关于多个文件中出现同一个变量的多个定义的原因,还有一种说法是由于早期C 语言
程序员粗心大意,经常忘记在声明变量时在前面加上 〝extern”关键字,使得编译器
会在多个目标文件中产生同一个变量的定义。为了解决这个问题,编译器和链接器干
脆就把未初始化的变量都当作 COMMON 类型的处理。

2、两个或两个以上弱符号类型不一致的处理:
当不同目标文件需要的空间大小不一致时,以最大的那块为准。在这里插入图片描述
.bss 段在目标文件和可执行文件中并不占用文件的空间,但是它在装载时占用地址空间(P100

输出文件中的空间如何分配给输入文件(链接过程的空间与地址分配)(P100

相似段合并
在这里插入图片描述

在链接之前,目标文件中的所有段的 VMA(虚拟地址 Virtual Memory Address) 都是 0,因为虚拟空间还没有被分配,所以他们默认都为 0,等到链接之后,可执行文件中的各个段都被分配到了相应的虚拟地址。

整个链接过程前后,目标文件各段的分配、程序虚拟地址如下图:
在这里插入图片描述

两步链接 – 链接器虚拟空间分配策略(P100

  • 空间与地址分配

收集段信息,合并段,建立映射

  • 符号解析与重定位

符号解析,重定位,调整代码中的地址

在这里插入图片描述

反汇编结果解读(P104

在这里插入图片描述

重定位表

对于可重定位的 ELF 文件来说,它必须包含有重定位表,用来描述如何修改相应的段
里的内容。对于每个要被重定位的 ELF 段都有一个对应的重定位表,而一个重定位表往往就是 ELF 文件中的一个段,所以其实重定位表也可以叫重定位段,我们在这里统一称作重定位表。比如代码段“text”如有要被重定位的地方,那么会有一个相对应叫“ rel.text” 的段保存了代码段的重定位表:如果代码段“.data” 有要被重定位的地方,就会有
一个相对应“rel.data”的段保存了数据段的重定位表。我们可以使用 objdump 来查看目标文件的重定位表,objdump -r a.o

  • .rel.text: 保存代码段(.text)的重定位表

RELOCATION RECORDS FOR [.text]

  • .rel.data: 保存数据段(.data)的重定位表

段地址对齐

在这里插入图片描述

Linux 进程地址空间布局(内核版本2.4.x)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

系统数据文件和信息

系统数据文件和信息 Unix 系统的正常运行需要使用大量与系统有关的数据文件,例如,口令文件 /etc/passwd 和组文件 /etc/group 都是经常被多个程序频繁使用的两个文件。用户每次登录 Unix 系统以及每次执行 ls -l 命令时都要使用口令文件。 /etc/passwd…

【设计模式-命令】

定义 命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,从而使您能够使用不同的请求、排队请求或记录请求,并支持可撤销的操作。该模式通过将请求与其执行分离,使得请求者和接收者之间…

第十四周学习周报

目录 摘要Abstract1. LSTM的代码实现2. 序列到序列模型3. 梯度与方向导数总结 摘要 在上周的学习基础之上,本周学习的内容有LSTM的代码实现,通过对代码的学习进一步加深了对LSTM的理解。为了切入到transformer的学习,本文通过对一些应用例子…

AGI时代存内计算芯片的语音识别之旅 —— 知存科技开发板体验与感悟

目录 一、简介 二、活动内容 2.1 多模态时代,存内计算框架的应用与发展 1、多模态时代计算需求 2、存内计算技术 3、知存科技存内产品 2.2 分布式环境下深度学习任务的高效可靠执行研究 基于强化学习的流水线分布式训练调度方案(PG-MPSS&#xf…

前端工程规范-4:Git提交前代码规范检查(Husky + Lint-staged)

Git提交前代码规范检查 在前端项目开发中,规范git提交信息,也是经常使用的手段,如何确保团队成员都遵循ESint规则,且不会将不符合规范的代码推送到Git仓库? 答案是:使用带有git hooks功能的husky。git hoo…

【LLM大模型】Ollama 运行 GGUF 模型

Ollama 默认直接支持很多模型,只需要简单的使用 ollama run命令,示例如下: ollama run gemma:2b就可安装、启动、使用对应模型。 通过这样方式直接支持的模型我们可以通过https://ollama.com/library 找到。 在https://huggingface.co/mod…

大端、小端区分与判断

大小端的判断是根据系统如何存储二进制数据来判断的 大端顾名思义,以数据的高位做开端的操作系统、小端也是以数据的低位做开端的操作系统 用最简单的例子: 对于数据0x01来说,高位为0低位为1,转十进制: 0x01 0 * 1…

RK3588主板PCB设计学习(五)

DDR中的一组信号线如何进行走线: 高亮这一组的焊盘,按照DDR4的走线要求,TOP层贴元器件的话从最下面的层开始走线: 先行CPU这一端把线拉出来,怎么顺怎么拉:如果在第六层拉不出来的话,在表层进行…

STM32DMA学习日记

STM32 DMA学习日记 写于2024/9/28晚 文章目录 STM32 DMA学习日记1. DMA简介2. I/O方式2.1 程序查询方式2.2 程序中断方式2.3 DMA方式 3.DMA框图4. 相关寄存器4.1 DMA中断状态寄存器(DMA_ISR)4.2 DMA中断标志清除寄存器(DMA_IFCR)…

[CSP-J 2022] 解密

题目来源:洛谷题库 [CSP-J 2022] 解密 题目描述 给定一个正整数 k k k,有 k k k 次询问,每次给定三个正整数 n i , e i , d i n_i, e_i, d_i ni​,ei​,di​,求两个正整数 p i , q i p_i, q_i pi​,qi​,使 n …

verilog实现FIR滤波系数生成(阶数,FIR滤波器类型及窗函数可调)

在以往采用 FPGA 实现的 FIR 滤波功能,滤波器系数是通过 matlab 计算生成,然后作为固定参数导入到 verilog 程序中,这尽管简单,但灵活性不足。在某些需求下(例如捕获任意给定台站信号)需要随时修改滤波器的…

【教程】57帧! Mac电脑流畅运行黑神话悟空

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 1、先安装CrossOver。网上有许多和谐版,可自行搜索。(pd虚拟机里运行黑神话估计够呛的) 2、运行CrossOver&#xf…

12、echarts 没有显示折线图

一、问题描述 echarts 没有显示折线图,但是,有数据显示: 看图表展示,y轴数据全部没有显示,直接可以判定是数据结构出问题了。 检查 series.data[] 数据结构: dataList [{"dateStr":"202…

鸿蒙开发(NEXT/API 12)【硬件(传感器开发3)】传感器服务

场景介绍 当设备需要获取传感器数据时,可以使用sensor模块,例如:通过订阅方向传感器数据感知用户设备当前的朝向,通过订阅计步传感器数据统计用户的步数等。 函数说明 名称描述OH_Sensor_GetInfos(Sensor_Info **infos, uint32…

GAMES101(作业8)

作业8 题目: 模拟绳子动画,包括基于物理的,和非物理的,应该修改的函数是:rope.cpp 中的void Rope::simulateEuler(... Rope::rope(...),,void Rope::simulateVerlet(...) 代码框架: main:负…

调试分析:[跳数度量]更改为[距离度量]后的 routing_bellmanford 算法

回顾复习2023年8月的《★修改Exata6.2源码:〔修改Bellmanford最短路径路由的衡量标准从【路由跳数】改为【“路由器节点间的物理距离”】,并动画演示〕》,VS2015调试Exata,跟踪调试修改后的[ routing_bellmanford.cpp ]源码&#…

Redis-常见数据类型(修改ing)

1. 预备知识 redis按照键值对的方式存储数据 1.1 基本全局命令 KEYS 返回所有满⾜样式(pattern)的key,⽀持如下统配样式: h?llo 匹配hello,hallo,hxlloh*llo 匹配hllo,heeeelloh[ae]llo 只匹配hallo helloh[^e]llo 匹配除hello,heee..llo以外的h[a…

Java-数据结构-Map和Set-(二)-哈希表 |ू・ω・` )

文本目录: ❄️一、哈希表: ☑ 1、概念: ☑ 2、冲突-概念: ☑ 3、冲突-避免: ☞ 1)、避免冲突-哈希函数的设计: ☞ 2)、避免冲突-负载因子调节(重点): ☑ 4、冲突-解决&…

宠物空气净化器该怎么选?希喂、美的、有哈这三款有推荐的吗?

终于要到国庆了,这可是打工人除春节外最长的假期!在外上班后,回家的次数越来越少了,这次国庆肯定要回去陪陪父母。这票是真难买啊,候补了我一个多星期才买到。本来以为最困难的问题已经解决了,又想到我家猫…

有通话质量更好的蓝牙耳机推荐吗?高品质的平价开放式耳机推荐

个人认为开放式耳机在通话方面还是表现不错的,主要有以下几个原因: 首先,在麦克风设计与配置方面: 拥有高品质麦克风硬件。优质的开放式耳机往往会配备高性能的麦克风,这些麦克风灵敏度较高,能够精准地捕捉…