程序的重定位
链接器会对所有的输入文件进行扫描,之后就可以确定段的大小,符号定义和符号引用的对应关系,并确定需要包含的库中的哪些模块,将这些段放置在输出地址空间的什么地方。
扫描完成后的下一步就是链接过程的核心,重定位。当我们提到重定位时,其实这个概念包含两种工作,一种是指当段不是从0地址开始的时候,需要调整程序中受到影响的地址,另一种是解析外部符号的引用,通常情况下,这两种工作时同时处理的。
链接器的第一次扫描会列出各个段的位置,并收集程序中全局符号与段的相对位置关系。一旦链接器确定了每一个段的位置,需要根据这个段的地址修改存储区中所有与之相关的地址信息,在大多数体系结构中,数据中的地址都是绝对的,嵌入到指令中的地址可能是绝对的,也可能是相对的。因此,链接器需要对他们进行修改,我们稍后会讨论这个问题。
第一遍扫描的过程中链接器会建立第5章描述的全局符号表,同时还会将引用全局符号的存储的地址解析替换为全局符号的实际地址。
7.1 硬件和软件重定位。
由于几乎所有的现代计算机都具有硬件重定位功能,可能会有人疑问为什么链接器或者加载器需要进行软件重定位,答案是,这样的设计出于运行时的性能考虑,也有一部分在优化绑定过程的时间。
硬件重定位允许操作系统位每个进程从一个约定好的固定位置开始分配独立的空间,这就使得程序的加载更加容易,并且可以避免一个地址空间中的程序错误破坏另一个地址空间中的程序,软件链接器或者加载器的重定位过程,就是将输入文件合并为一个大文件以加载到硬件重定位提供的地址空间中,然后就根本不需要修改任何加载时的地址了。
在286或者386这种可以创建几千个段的机器上,实际上有可能做到为每一个例程或者全局数据分配一个段,独立的进行软件重定位,每一个例程或数据可以从各自段的0位置开始,所有的全局引用都变成段间饮用,通过查找系统段表来处理,并在运行时进行绑定,不幸的是,x86的段查找非常慢,而且如果程序对每一个过程调用或者全局数据引用都要进行段查找的话,那速度就更慢了。 还有一个重要的因素,虽然运行时绑定会在一定程序上改善性能,但是大多数程序都没有采用,为了让程序更加可靠,链接器最终选择将所有程序文件绑定在一起并且在链接时确定符号地址,这样的设计,可以使得程序在调试时的表现相对固定,而且出货后仍然能保持一致性,当一个程序的运行环境中使用的库版本于开发人员的使用版本不一致的时候,容易引起库的二进制兼容问题,这种问题是程序错误的主要原因之一,并且难以发现,及时不考虑286风格的段的引起的访存负载,动态连接比起静态链接而言也要慢很多,当程序用不到这些功能的时候,显然没有必要引入这些代价。
7.2 链接时重定位和加载时重定位
很多系统即执行链接时重定位,也执行加载时重定位。链接器将一系列的输入文件合并成一个输出文件。并为其确定将要加载到的地址,但是,这个程序被加载时,所预设的那个加载地址可能不可用。或者已经被其他程序占用,此时加载器会将它加载到另外的地址上,并且重新定位被加载的程序以使之与实际的家在地址相对应,在一些系统上,每一个程序都按照加载到地址0的位置而被链接。而实际程序的加载地址是根据有效的存储空间而定的,因此这个程序在被加载到一个固定地址的方式来链接,并且这个地址通常一定是有效的,一般不会进行加载时重定位,除非发生该地址已经被别的程序所占用之类的异常情况。
相比链接时重定位,加载时重定位比较简单,链接时重定位,需要根据段的大小和段的位置重新定位程序中的地址项,而在加载时,整个程序会被当成一个巨大的段,加载器的重定位只需要判断原计划的加载地址和实际的加载地址之间的差异即可。
相关文章:
程序的重定位
可以理解为编译和链接 过程中产生的地址项都是临时的相对的。编译的时候的地址,在链接时会被修改。最终链接后生成的bin文件的地址项,在加载运行时 也会被修改。 链接器会对所有的输入文件进行扫描,之后就可以确定段的大小,符号定…...
【STM32F103】TIM定时器PWM
定时器分类 STM32F1中除了互联型产品(STM32F103C8T6为64KB Flash 中容量产品),其余有8个定时器。 可以8个定时器分为高级,通用,基本三种。 高级定时器有两个,分别是TIM1和TIM8。 通用定时器有四个&…...
图论及其应用的一些论断---选择题
在任意一个网络N=(X,Y,I,A,c)中,最大流的值等于最小割的容量。在任意6个人的集会上,要么有3个人互相认识,要么有3个人互不认识。若G为无向简单图,则图G的边数ε,点数v之间有: ε < = ( v 2 ) ε<=\binom{v}{2} ε<=...
腾讯云轻量应用服务器镜像操作系统如何选择?
腾讯云轻量应用服务器镜像怎么选择?镜像是指轻量服务器的操作系统,可以选择宝塔Linux面板8.0.4腾讯云专享版,如果需要Win系统建议选择Windows Server 2012 R2 中文版,腾讯云服务器网txyfwq.com分享腾讯云轻量应用服务器镜像操作系…...
鸿蒙原生应用/元服务开发-发布基础类型通知类型与接口
基础类型通知主要应用于发送短信息、提示信息、广告推送等,支持普通文本类型、长文本类型、多行文本类型和图片类型。 表 基础类型通知中的内容分类 目前系统仅通知栏订阅了通知,将通知显示在通知栏里。基础类型通知呈现效果示意图如下所示。 图1基础类…...
Apisix常见问题
1.通过接口操作路由时X-API-KEY cd /usr/local/apisix/conf vim config-default.yaml注释掉这一部分 #allow_admin: # http://nginx.org/en/docs/http/ngx_http_access_module.html#allow# - 0.0.0.0/24 # If we dont set any IP list, then a…...
Docker 安装Mysql
目录 Docker Mysql安装 ✨安装和配置mysql ✨远程连接mysql远程连接 MySQL 是世界上最流行的开源数据库。根据 DB-Engines的调查数据,MySQL 是第二受欢迎的数据库,仅次于 Oracle 数据库。MySQL在过去由于性能高、成本低、可靠性好,已经成…...
Pillow图像处理(PIL.Image类的详细使用)
文章目录 Opencv、Matplotlib(plt)、Pillow(PIL)、Pytorch读取数据的通道顺序Python图像处理库(PIL、Pillow、Scikit-image、Opencv)Pillow 官方文档(超详细,超推荐)一、PIL库与Pillow库的区别二、Pillow库(…...
嵌入式开发——ADC开发
学习目标 了解ADC开发流程掌握采样方式能够使用ADC进行芯片内部通道进行采样能够使用ADC对外部电路进行采样学习内容 GD32F4的ADC 特点: 16个外部模拟输入通道;1个内部温度传感通道(VSENSE);1个内部参考电压输入通道(VREFINT);1个外部监测电池VBAT供电引脚输入通道。ADC开…...
FreeSWITCH t38测试
主叫 192.168.100.205 被叫 192.168.100.121 主叫侧发送multipage.tif 被叫侧接收传真,保存为recv.tif 主叫侧: originate [fax_enable_t381][fax_verbose1][fax_disable_v170][fax_ident77777777][fax_enable_t38_request1]sofia/internal/1234192.168.100.121:…...
跑腿配送系统技术探析
概述 跑腿配送系统是一种基于现代科技的服务平台,通过智能化的技术手段,实现用户需求的快速响应和高效配送。本文将探讨该系统的核心技术原理,以及在实际开发中的一些代码示例。 技术原理 1. 用户请求与任务分配 跑腿配送系统的第一步是…...
【数据不完整?用EM算法填补缺失】期望值最大化 EM 算法:睹始知终
期望值最大化算法 EM:睹始知终 算法思想算法推导算法流程E步骤:期望M步骤:最大化陷入局部最优的原因 算法应用高斯混合模型(Gaussian Mixture Model, GMM)问题描述输入输出Python代码实现 算法思想 期望值最大化方法&a…...
PMP证书可以挂靠吗?
PMP证书不是国内的证书,挂靠不了呀,想挂靠,可以考软考/一建等,里面也有项目管理相关的证书。 PMP证书虽然不能挂靠,但是用处还是很大的,例如提升个人能力、薪资待遇,还有持证可享一些城市的福利…...
HTML语义化的理解
HTML语义化是指在编写HTML代码时,合理地选择适当的标签和属性来描述页面的结构和内容,使得代码更具有可读性、可维护性和可访问性。 可读性:通过使用语义化的标签,可以清晰地表达页面的结构和内容,使得代码更易于阅读和…...
(Java企业 / 公司项目)注册,配置中心Nacos的怎么使用?(含相关面试题)(一)
在企业项目中使用Nacos实现的功能操作,以及如何在自己的环境中搭建Nacos环境,包含demo 一. 官网介绍:home (nacos.io) 文档地址:Nacos 快速开始 二. 准备Nacos环境 在公司里面很多的服务以及环境都是自己搭建的所以我在这里就从…...
计算机网络---知识点
ARPANET----NFSNET—ANSNET—Internet发展及协议 移动互联网 物联网 无线自组网、无线传感器网络、无线个域网 ISO/OSI网络体系结构 TCP/IP网络体系结构 对等通信、PDU 电路交换、报文交换、分组报文交换 虚电路、数据报 信道复用技术 网络性能的主要指标(…...
力扣42. 接雨水
双指针法 思路: 将数组前后设置为 left、right 指针,相互靠近;在逼近的过程中记录两端最大的值 leftMax、rightMax,作为容器的左右边界;更新指针规则: 如果数组左边的值比右边的小,则更新 left…...
SpringSecurity-2.7中跨域问题
SpringSecurity-2.7中跨域问题 访问测试 起因 写这篇的起因是会了解到 SSM(CrosOrigin)解决跨域,但是会在加入SpringSecurity配置后,这个跨域解决方案就失效了,而/login这个请求上是无法添加这个注解或者通过配置(WebMvcConfig)去解决跨域,所以只能使用SpringSecurity提供的.c…...
Java解决字典序最小回文串
Java解决字典序最小回文串 01 题目 给你一个由 小写英文字母 组成的字符串 s ,你可以对其执行一些操作。在一步操作中,你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 ,使 s 变成一个 回文串 。如果执行 最少 操…...
【力扣100】207.课程表
添加链接描述 class Solution:def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:# 思路是计算每一个课的入度,然后使用队列进行入度为0的元素的进出# 数组:下标是课程号,array[下标]是这个课程的入度# 哈希…...
AceCommon:Arduino嵌入式零堆分配轻量C++工具库
1. AceCommon 库概述:面向嵌入式 Arduino 的轻量级底层工具集AceCommon 是一个专为资源受限的微控制器平台(尤其是 Arduino 生态)设计的零依赖、低开销 C 工具库。其核心设计哲学是“小而精、无侵入、可复用”。与常见的功能臃肿、依赖繁杂的…...
突破远程桌面限制:RDP Wrapper实现多用户并发连接的创新解决方案
突破远程桌面限制:RDP Wrapper实现多用户并发连接的创新解决方案 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 副标题:适用于Windows Vista至Windows 11全版本的远程桌面功能扩展工具 在…...
开源风扇控制工具FanControl全攻略:从问题诊断到散热方案优化
开源风扇控制工具FanControl全攻略:从问题诊断到散热方案优化 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tren…...
2026年上海网站建设市场分析:企业官网从展示到增长的演进路径
2026年,上海企业数字化服务市场迎来结构性变革。据2026年上半年上海企业数字化服务市场调研数据显示,上海地区企业官网新建与升级需求同比增长45%,中大型企业对官网的核心诉求已从基础信息展示转向AI智能赋能、全球化跨境适配、全链路营销转化…...
OpenCV4编译后pkg-config失效?教你如何正确生成opencv4.pc文件(附完整CMake参数)
OpenCV4编译实战:从源码构建到pkg-config配置全解析 在Linux环境下从源码编译OpenCV4是许多计算机视觉开发者的必经之路,但不少人在成功编译后却发现pkg-config --modversion opencv命令报错"找不到opencv包"。这并非你的操作失误,…...
从零开始手搓一个xv6内核页表:跟着MIT 6.S081源码一步步理解虚拟内存初始化
从零构建xv6内核页表:深入解析RISC-V虚拟内存初始化实战 在MIT 6.S081操作系统的学习过程中,xv6作为教学用精简内核,其虚拟内存实现是理解现代计算机内存管理的关键。本文将带您从第一行代码开始,完整复现xv6内核页表的构建过程&…...
百川2-13B-4bits量化实测:OpenClaw长文本处理会丢信息吗?
百川2-13B-4bits量化实测:OpenClaw长文本处理会丢信息吗? 1. 测试背景与动机 最近在尝试用OpenClaw搭建个人自动化工作流时,遇到一个实际问题:当处理长文档(比如几十页的PDF或网页文章)时,AI助…...
9大核心优势!Outfit字体全方位应用指南:从安装到精通
9大核心优势!Outfit字体全方位应用指南:从安装到精通 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts Outfit字体作为一款专业开源无衬线字体,凭借9种完整字重体…...
OpenRGB:统一多品牌设备控制的开源RGB解决方案
OpenRGB:统一多品牌设备控制的开源RGB解决方案 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/OpenRGB. Releases can …...
求一个V站邀请码
有没有大佬可以给个邀请码~~~~~~~~~~~~~~~~~~...
