1、链接(link)

news2024/11/19 7:49:28

链接的作用

链接:将各种代码和数据片段收集组成一个单一文件的过程,这个文件可以加载(复制)到内存并执行。

分为:编译时、加载时(加载器加载到内存并执行时)、运行时

1、构造大型程序
2、避免一些危险的编程错误
3、理解语言的作用域是如何实现的
4、理解其他重要的系统概念
5、更好的利用共享库

gcc -Og -o prog main.c sum.c

1、预处理生产.i文件(ccp)
2、转换成汇编文件.s(cc) 
3、汇编变成目标代码.o(as)
4、链接目标代码生成可执行程序(ld)
5、shell调用OS中一个叫(loader)函数:它将可执行prog中代码与data装入内存,然后将控制转移到这个程序的开头。

链接器有两个任务:将模块连接起来,确定连接块运行位置,并且修改代码与数据中位置
1、符号解析:目标文件定义和引用符号,每个符号对应一个函数,一个全局变量或者一个静态变量(static声明的变量)。将每个符号引用正好与一个符号定义关联起来。符号定义存在目标文件obj里面的符号表(结构数组+名字、大小、位置)
2、重定位:链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节。修改所有对这些符号的引用,使得它们指向这个内存位置

目标文件

目标文件纯粹是字节集合

可重定位目标文件(.o文件)、可执行目标文件(.a文件)、共享目标文件(.so文件)

编译器汇编器:生成可重定位文件        链接器生成可执行目标文件

可重定位文件

ELF文件(可执行可链接格式文件)

1、elf头部:字大小、字节顺序、文件类型、机器类型、页大小、每段虚拟地址、段大小
2、.text:代码段
3、.rodata:只读data
4、.data:初始化空间变量(全局+static)
5、.bss:定义未初始化空间,但是不占用任何空间,只是占位符(程序加载时分配)
6、.symtab:不包含局部变量,此条目可以用STRIP除去这个表
7、.rel.text:外部函数调用与全局变量引用指令需要修改。调用本地函数不需要修改
8、.rel.data:被模块引用或定义的所有全局变量的重定位信息(7、8重定位信息部分)

9、debug:调试符号表信息
节头部表:告诉不同部分的起始位置

ELF首部+不同的section+描述section信息的表

7f 45 4c 46(ELF Magic头部) 02(类型) 01(大小端) 01 00 00 00 00 00 00 00 00 00

可执行文件

可执行文件被设计得很容易加载到内存中,可执行文件连续片被映射到连续内存段。程序头部表 描述了这种映射段头部表。

elf头部包括prog入口点执行第一条指令地址
定义了一个init函数,初始化调用
因为已经完全连接了故而没了rel节

符号与符号表

全局变量:被其他模块调用:非静态函数和全局变量
外部符号:其他的定义被main调用:在其他模块定义的函数和变量
局部符号:只能自己用:带static属性的函数和全局变量

但是static的变量不在栈中管理在.bss和.data中

函数名称或已初始化全局变量为强符号,未初始化的为弱符号

符号解析

链接器解析符号引用的方法是将每个引用于它输入的可重定位目标文件的符号表中的一个确定符号定义关联起来。

1、局部变量只能有一个定义
2、static变量也会有本地链接器符号,且确保唯一名字
3、多个目标文件可能会定义相同名字的全局符号(①标志一个错误②要么以某种方法选出一个定义并抛弃)

链接器输入是一组可重定位目标模块。每个模块定义一组符号,有些局部有些全局

强符号:函数和已初始化全局变量        弱符号:未初始化全局变量
1、不允许有多个同名强符号
2、一个强和多个弱选强
3、多个弱选一个弱

与静态库链接

所有编译系统都一共一种机制,将所有相关模块打包成为一个单独文件称为静态库。

可以用作linker输入。当linker构造一个可输出的可执行文件时,只复制static、lib被应用程序引用的目标模块

如果不用静态库则
1、编译器辨认出对标准函数的调用,并生成代码(Pascal)
2、将所有标准函数都放在一个单独可重定位目标模块中,然后将其链接进可执行文件中
缺点:但是每个可执行文件都有一个副本浪费空间,另外如果标准函数库改变,则全部文件需要重新编译
3、为每个标准函数创建独立可重定位文件,存放在一定的目录下。(难记且易错)

静态库提出可以解决上述三者问题
相关函数可以编译成独立模块并装入单独静态模块(.a文件)
链接时只复制被程序引用的目标模块,名字少好记
静态库以一种称为存档的特殊文件格式存放在磁盘中。存档文件是一组连接起来的可重定位目标文件集合。

链接解析引用

链接器从左到右按照编译器驱动程序命令行上出现的顺序来扫描重定位文件和存档文件。

E:可重定位文件
D:在E中输入文件中定义的符号集合
U:在E中未解析符号

扫描到一个文件放入E,将其中的符号分类到UD中,当扫描所有文件后U为空则构成输出的可执行文件。

加载可执行文件

Linux > ./prog

所有Linux程序可以调用execve函数来调用加载器。加载器将可执行目标文件的数据和代码从磁盘中加载到主存中,然后跳到程序的入口来运行程序。

_start()→_libc_start_main()→main()→_libc_start_main()→linux内核

动态链接共享库

静态库缺点:1、静态库需要定期维护与更新。2、几乎每个程序都需要IO函数,这些函数代码会复制进代码中从而浪费内存。

使用共享库来完善,共享库运行或加载时,可以被加载到任意的内存地址、还可以与内存的程序链接起来,整个过程称为动态链接。

在链接器ld中不会复制共享文件的代码和数据到可执行文件中,只是复制了符号表与一些重定位信息。(生成的prog中包含一个interp节:包含动态链接器的路径)

重定位libc.so文本和数据到某个内存段
重定位libvector.so文本和数据到另一个内存段中
重定位prog对lib.so和libvector.so定义符号引用

重定位条目:重定位PC相对引用、绝对引用

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

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

相关文章

绿色转型,节能攻坚

随着人口增长和经济发展,资源短缺和环境污染问题愈发严重,绿色转型和节能已成为我们共同的责任。为了推动环保事业的发展,阜阳善于善行志愿者团队,参与了本年度以“绿色转型,节能攻坚”为主题的全国节能宣传周活动。这…

果汁机锂电池充电,5V升压12.7V 升压恒压芯片SL1571B

在现代化的日常生活中,果汁机已经逐渐成为了许多家庭厨房的必备电器。随着科技的不断进步,果汁机的性能也在不断提升,其中锂电池的应用更是为果汁机带来了前所未有的便利。而5V升压12.7V升压恒压芯片SL1571B,作为果汁机锂电池充电…

使用使用rundll32 调用指定dll的方法

使用使用rundll32 调用指定dll的方法 //顾名思义,"执行32位的DLL文件"。它的作用是执行DLL文件中的内部函数,这样在进程当中, 只会有Rundll32.exe,而不会有DLL后门的进程,这样,就实现了进程上的隐…

【万方数据库爬虫简单开发(自用)】

万方数据库爬虫简单开发(自用)(一) 使用Python爬虫实现万方数据库论文的搜索并获取信息1.获取url2.输入关键词3.使用BeautifulSoup解析4.获取文章标题信息 使用Python爬虫实现万方数据库论文的搜索并获取信息 后续会逐步探索更新…

svg图标封装--基于vue2适配uniapp全端

第一步&#xff1a;新建svg目录 在static目录下新建svg目录,后将所有svg图标都放到此文件夹 第二步&#xff1a;封装注册全局组件 (注意&#xff1a;在根目录下新建components文件夹) 代码实现&#xff1a; <template><!-- svg图标 --><image :style"{ …

欢乐钓鱼大师攻略:自动钓鱼大全解析!哪家云手机能自动钓鱼?

《欢乐钓鱼大师》是一款颇受欢迎的钓鱼模拟游戏&#xff0c;吸引了大量玩家参与。无论你是新手还是老玩家&#xff0c;这款游戏都提供了丰富的内容和玩法&#xff0c;今天我们将详细介绍如何通过合理的策略和技巧来提升游戏体验和效率。 一、初步了解《欢乐钓鱼大师》 1. 游戏…

蝴蝶号小店,玩法介绍~

我是王路飞。 目前电商行业最火的项目&#xff0c;已经不再是抖音小店了。 毕竟抖店都上线好几年了&#xff0c;红利期早就过了&#xff0c;再加上现在抖音上的商家逐渐开始内卷。 众多商家纷纷开始寻找电商行业最后的风口。 因此&#xff0c;蝴蝶号小店逐渐开始进入大众视…

面试官问:百万QPS秒杀系统该如何设计

今天就带大家体系化的梳理下&#xff0c;大厂级高并发的秒杀系统该如何设计。 带大家跳出程序员思维&#xff0c;从架构师的视角分析下&#xff0c;大厂级、高并发的秒杀系统该如何设计&#xff1f; 秒杀系统的三个问题 问题一&#xff1a;为什么需要秒杀系统&#xff1f; 简…

人人必看:人工智能成熟后,被社会广泛使用后,可能被取代的行业有哪些,以及AI后新兴的行业和职位有哪些?

随着人工智能技术的不断成熟和广泛应用&#xff0c;许多行业和职位可能会受到影响&#xff0c;一些可能被取代&#xff0c;而另一些则会因为AI技术的引入而新兴。人人必看&#xff1a;人工智能成熟后&#xff0c;被社会广泛使用后&#xff0c;可能被取代的行业有哪些&#xff0…

df = pd.read_excel(‘c:\User\18343\Desktop\wpsdata.xlxs‘)路径读不到

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

为啥影像导入GIS后,颜色会变?两个方法解决它!

不知道你有没有遇到过这种情况&#xff0c; 影像的正常颜色是这样的—— 可是导入到GIS后&#xff0c; 颜色竟然变了&#xff0c; 而且变得很奇怪—— 你也不必惊讶&#xff0c; 极大概率是因为数据源类型没有正确识别&#xff0c; 有两个方法可以解决这个问题—— 方法一…

Threejs-07、几何体_顶点_索引_面之BufferGeome

一、 const gemometry new THREE.BufferGeometry(); //创建顶点数据 ,顶点是有序的&#xff0c;每三个为一个顶点&#xff0c;逆时针为正面。 const vertices new Float32Array([-1.0,-1.0,0.0,1.0,-1.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,-1.0,1.0,0.0,-1.0,-1.0,0.0, ]) gemom…

申办乙级幕墙设计资质:企业安全生产与环保要求

在申办乙级幕墙设计资质时&#xff0c;企业安全生产与环保要求是不可忽视的重要方面。以下是关于企业安全生产与环保要求的详细解读&#xff0c;以分点表示和归纳的方式呈现&#xff1a; 一、安全生产要求 安全生产管理制度&#xff1a;企业应建立健全安全生产管理制度&#xf…

操作系统期末复习(大题)

1. 进程调度 周转时间作业完成时刻-作业到达时刻 带权周转时间周转时间/服务时间 平均周转时间各个作业周转时间之和/作业个数 操作系统&#xff1a;周转时间和其他时间_系统为作业提供的时间-CSDN博客 2. 进程调度 3. 调度算法 4. 临界区互斥访问问题 即证明是否满足互斥&a…

hadoop和hbase对应版本关系

https://hbase.apache.org/book.html#configuration

【ai】openai-quickstart 配置pycharm工程

之前都是本地执行脚本【AI】指定python3.10安装Jupyter Lab环境为:C:\Users\zhangbin\AppData\Local\Programs\Python\Python310 参考之前创建的python工程 使用的是局部的私有的虚拟环境 pycharm给出的解释器 直接使用现有的,不new了 可以选择3.10 :可以选虚拟的:

神卓互联内网穿透:使用超简单,拿捏

神卓互联内网穿透技术是一种能够打破内网与外网之间壁垒的创新技术。它通过一系列智能的网络协议和算法&#xff0c;实现了将企业内部网络资源安全、稳定地暴露给外部网络访问。这使得无需进行复杂的网络配置和改造&#xff0c;就能轻松实现远程办公、跨地域协作等重要应用。 神…

SPME2024开幕在即,深兰科技商用清洁机器人新品推介会蓄势待发

6月5日&#xff5e;7日&#xff0c;以“跨界融合洞见未来”为主题的“2024 SPME第六届上海国际物业管理产业博览会”(以下简称“物博会”)将在上海世博展览馆举行。应主办方邀请&#xff0c;深兰科技携多款AI清洁机器人亮相本届展会&#xff0c;向来自全球各地的观展企业家、经…

怎么提取视频中的音频?这四种提取方法你肯定用的上!

怎么提取视频中的音频&#xff1f;在当今日新月异的数字时代&#xff0c;视频已跃升为信息交流的璀璨明星&#xff0c;然而&#xff0c;它的成功并非孤身一人&#xff0c;而是与音频这位不可或缺的伙伴并肩作战&#xff0c;音频不仅仅是声音的简单呈现&#xff0c;它更是情感的…

设计模式-00-简介

1、设计模式的面试题 原型设计模式 ● 1&#xff09;有请使用 UML 类图画出原型模式核心角色 ● 2&#xff09;原型设计模式的深拷贝和浅拷贝是什么&#xff0c;并写出深拷贝的两种方式的源码&#xff08;重写 clone 方法实现深拷贝、使用序列化来实现深拷贝&#xff09; ● …