5. 链接和加载(linker and loader)

链接和加载(linker and loader):

linker即链接器,它负责将多个.c编译生成的.o文件,链接成一个可执行文件或者是库文件;

loader即加载器,它原本的功能很单一只是将可执行文件的段拷贝到编译确定的内存地址即可,但是有了动态链接库以后,部分的外部库引用符号在加载的时候才会得到解析,所以加载也要处理链接器的相同操作重定位。

重定位原理:

符号表(Symbol Table):

符号表就是一张字符符号和地址的对应表,符号表的作用就是一个助记符,用一个字符串来标示某些抽象的地址,它能标示的地址有代码地址和数据地址,代码地址包括函数名、跳转标号,数据地址包括全局变量

符号表的组织如下图所示:

图片

符号表的作用就是将符号名称和地址进行绑定。而绑定的根本目的就是方便对符号的引用,在符号值发生改变的时候,不需要去手工改动源代码中对符号引用的地方,而这种改动是由链接程序在重新生成执行文件时自动完成的。

重定位表(Relocation):

有了符号表,就需要有人对符号表进行引用,在程序的执行过程中对全局变量的引用、跳转、调用函数,这些都涉及到相应的符号引用。符号和其引用是一对多的关系,一个符号可能被代码中多处引用。因为符号值改变的时候,也需要对所有引用符号的地方的代码进行修改,所以需要还有一张表来记录符号表的引用关系,这就是重定位表:

在这里插入图片描述

从上图可见,重定位表项用来记录链接和加载的过程中需要重新定位的位置,在各个段位置发生改变而引起符号地址改变时,根据重定位表来修改符号引用的值。

GOT表(Global Offset Table):

加载过程中的重定位,使用了一种改良的重定位手段:即通过两张间接访问表来屏蔽掉重定位带来的对代码的修改,访问外部数据使用GOT,访问外部程序使用PLT。这样可链接出位置无关代码PIC(Position Independent Code),需要重定位时只需要修改GOT和PLT的值,而不需要去改动可执行代码。

图片

PLT表(Procedure Linkage Table):

加载过程中的重定位为了避免对代码的修改,引入了GOT来屏蔽对数据的访问,同理对外部代码的访问也是可以用GOT来访问的。但是为了实现动态链接的特性,即使用的时候才链接,不使用时可以不用链接,对外部代码的访问引入了一个新的表项PLT。

图片

elf文件:

elf文件格式:

Linux环境下,三种类型的执行文件都可以使用elf格式来表示:可重定位文件(即编译生成但是未连接的文件)、动态库文件、可执行文件。

Elf文件提供了两种文件解析的视角,链接视角和动态加载视角链接视角使用section的概念来解析文件,主要关注链接过程的使用;动态加载视角使用segment的概念来解析文件,主要关注加载和动态链接的实现。

在这里插入图片描述

整个文件的组织框图如上所示,ELF头描述了section header table和program header table的起始位置、表项大小和个数。根据section header table来寻址相应的section,根据program header table来寻址相应的segment,可以看到一般是一个segment包含多个section。

Linux下可以操作elf文件的有以下工具:

a.readelf
“readelf –a file“读出elf文件的所有信息。b.nm
“nm file“读出elf文件的符号表信息。c.objdump
“objdump –d file“反汇编出elf文件中包含可执行代码的section,elf命令中功能最强大的一个。d.objcopy
转换elf文件为bin或者其他格式的文件,编译内核的时候会使用到。e.strip
去掉elf文件中符号表和调试信息,对elf文件进行减肥。f.addr2line
将绝对地址,转换成调试信息中的源文件行号。

elf文件中符号表和调试信息,对elf文件进行减肥。

f.addr2line
将绝对地址,转换成调试信息中的源文件行号。


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

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

相关文章

英福康INFICON残余气体RGA General Chinese中文培训PPT课件

英福康INFICON残余气体RGA General Chinese中文培训PPT课件

【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目

作者推荐 视频算法专题 本文涉及知识点 树上倍增 树 图论 并集查找 换根法 深度优先 割点 LeetCode3067. 在带权树网络中统计可连接服务器对数目 给你一棵无根带权树,树中总共有 n 个节点,分别表示 n 个服务器,服务器从 0 到 n - 1 编号…

Java | 在消息对话框中显示文本

首先需要导入JOptionPane类,JOptionPane类属于Swing组件中的一种,其导入方式如下: import javax.swing.JOptionPane;可以使用JOptionPane的showMessageDialog方法显示消息文本。 参数格式: JOptionPane.showMessageDialog(paren…

【C语言】指针详细解读2

1.const 修饰指针 1.1 const修饰变量 变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。 …

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.03.01-2024.03.05

论文目录~ 1.CLEVR-POC: Reasoning-Intensive Visual Question Answering in Partially Observable Environments2.Feast Your Eyes: Mixture-of-Resolution Adaptation for Multimodal Large Language Models3.MADTP: Multimodal Alignment-Guided Dynamic Token Pruning for …

RK3568平台开发系列讲解(基础篇)注册字符设备

🚀返回专栏总目录 文章目录 一、字符设备初始化二、字符设备的注册和注销三、实验代码沉淀、分享、成长,让自己和他人都能有所收获!😄 注册字符设备可以分为两个步骤: 字符设备初始化字符设备的添加一、字符设备初始化 字符设备初始化所用到的函数为 cdev_init(…),在对…

Django面对高并发现象时处理方法

首先,我们需要使用适当的数据库引擎来处理高并发。默认情况下,Django使用的是SQLite数据库,但在高并发的情况下,它可能会变得非常慢。我们可以考虑使用更适合高并发的数据库,如MySQL或PostgreSQL。这些数据库引擎具有更…

解决QMYSQL driver not loaded问题

前言 之前都是在Qt5.51上开发,连接mysql数据库一直没有问题,换到5.15.2后一直报错 一查才发现\5.15.2\msvc2019_64\plugins\sqldrivers目录下没有qsqlmysql了,5.5.1是有的,5.15.2是要自己编译的。。。 下载源码 安装qt的时候没…

什么是IoC和AOP?

如何在实际项目中应用这些设计模式? 在实际项目中应用设计模式需要根据项目的需求和特点进行具体的选择和实现。以下是一些常见的方法和建议: 了解设计模式: 首先需要对各种设计模式有深入的了解,包括它们的原理、优缺点以及适用…

Vue tree树状结构数据转扁平数据

//数据结构可参考饿了么UItreeData: [{id: 1,label: Level one 1,type: 1,children: [{id: 4,label: Level two 1-1,type: 2,children: [{id: 9,label: Level three 1-1-1,type: 3}, {id: 10,label: Level three 1-1-2,type: 3}]}, {id: 11,label: Level three 1-2,type: 2,chi…

查看kafka消息消费堆积情况

查看主题命令 展示topic列表 ./kafka-topics.sh --list --zookeeper zookeeper_ip:2181描述topic ./kafka-topics.sh --describe --zookeeper zookeeper_ip:2181 --topic topic_name查看topic某分区偏移量最大(小)值 ./kafka-run-class.sh kafka.too…

2024-3-6 python列表的切片赋值

切片赋值 如果把切片放在赋值语句的左边,或把它作为del操作的对象,我们就可以对序列进行嫁接、切除 或就地修改操作。 >>> l [i for i in range(20)] >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 1…

小白如何快速入门计算机视觉?

去年 11 月的时候,给自己了一个目标,希望在未来的 3个月时间里,写满100篇关于从零入门AI视觉的算法、代码文字。 历经 3 个月,终于在今天 100 篇文章写完了,代码也全部调试完成,上传到 github 上开源给大家…

旧物回收小程序开发:环保与科技的创新结合

随着科技的飞速发展,我们的日常生活越来越离不开手机应用程序。而在环保日益成为社会焦点的今天,如何将科技与环保相结合,成为了一个值得深思的问题。今天,我们将探讨旧物回收小程序的开发,它如何助力环保,…

【重要公告】BSV区块链上线TypeScript SDK,未来将支持更多开发语言

​​发表时间:2024年2月21日 BSV区块链协会宣布上线JavaScript和TypeScript SDK(即“标准开发工具包”)。TypeScript SDK旨在为开发者提供新版统一核心代码库,以便利开发者在BSV区块链上开发能够任意扩容的应用程序。新上线的SDK替…

SpringBoot集成自然语言处理hanlp工具包

HanLP是一系列模型与算法组成的NLP工具包&#xff0c;目标是普及自然语言处理在生产环境中的应用。 下载与配置 <dependency><groupId>com.hankcs</groupId><artifactId>hanlp</artifactId><version>portable-1.8.4</version> <…

掌握Python操作Word:从基础到高级全覆盖

掌握Python操作Word&#xff1a;从基础到高级全覆盖 引言Python操作Word的基础文档的创建与打开文档的基本操作 创建和打开Word文档创建新的Word文档打开现有文档读取文档内容修改现有文档 编辑文档内容添加和编辑文本设置格式插入标题 处理文档结构操作段落列表的处理表格的操…

深入理解 Vuex:从基础到应用场景

前言 在之前的文章中&#xff0c;我们已经对 Vue.js 有了一定的了解。今天我们要对Vue官方的状态共享管理器Vuex进行详细讲解&#xff0c;将其基本吃透&#xff0c;目标是面对大多数业务需求&#xff1b; 一、介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用…

『操作系统OS笔记』MAC(m1芯片)电脑安装FFmpeg

MAC(m1芯片)电脑安装FFmpeg mac电脑安装ffmpeg两种方法 文章目录 1. brew安装FFmpeg2. 官网下载FFmpeg压缩包3. 使用FFmpeg将音频和视频合并 1. brew安装FFmpeg brew install ffmpeg # 需要等比较久的时间&#xff0c;安装很多东西&#xff0c;安装过程中如果遇到报错对应解决…