1、链接(link)

链接的作用

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

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

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相对引用、绝对引用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python魔法之旅-魔法方法(22)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

【数学】927. 三等分

本文涉及知识点 数学 LeetCode927. 三等分 给定一个由 0 和 1 组成的数组 arr &#xff0c;将数组分成 3 个非空的部分 &#xff0c;使得所有这些部分表示相同的二进制值。 如果可以做到&#xff0c;请返回任何 [i, j]&#xff0c;其中 i1 < j&#xff0c;这样一来&#…

消费增值模式引领业绩飙升与用户活跃

大家好&#xff0c;我是吴军&#xff0c;致力于为您揭示私域电商领域的独特魅力与机遇。 今日&#xff0c;我很高兴与大家分享一个激动人心的成功案例。我们的客户在短短一个月的时间里&#xff0c;业绩就飙升至上百万级别&#xff0c;其用户活跃度更是居高不下&#xff0c;日…

如何进行考试成绩分析

一、为什么要对考试成绩进行分析&#xff1f; 考试成绩进行分析是一项重要的工作&#xff0c;可以为学生、教师和学校提供有效的学习评价和支持&#xff0c;同时也可以为教学改进和提高教学质量提供有力的支持和指导。对考试成绩进行分析有以下几个原因&#xff1a; 1.了解学生…

Keil一键添加.c文件和头文件路径脚本--可遍历添加整个文件夹

最近想移植个LVGL玩玩&#xff0c;发现文件实在是太多了&#xff0c;加的手疼都没搞完&#xff0c;实在不想搞了就去找脚本和工具&#xff0c;基本没找到一个。。。。。。 主要是自己也懒得去研究写脚本&#xff0c;偶然搜到了一个博主写的脚本&#xff0c;原博客地址:https:/…

【鸿蒙开发教程】HarmonyOS 模块关系梳理

HarmonyOS 梳理模块关系 刚开始开发的时候总是理不清鸿蒙中的模块类型和关系&#xff0c;今天就来梳理下鸿蒙中的模块类型 Module类型 Module按照使用场景可以分为两种类型&#xff1a; ●Ability类型的Module&#xff1a; 用于实现应用的功能和特性。每一个Ability类型的M…

西南交通大学【操作系统实验2】

实验目的 本实验要求学生了解什么是信号&#xff0c;掌握软中断的基本原理&#xff1b;掌握中断信号的使用、进程的创建以及系统计时器的使用。通过对本实验的学习&#xff0c;学生能够学会进程的创建方法&#xff0c;更能加深对Linux中的信号机制的认识&#xff0c;并会使用软…

《银行存量客户运营》导读

前言&#xff1a;在中国生活&#xff0c;没有一个人能够离得开银行&#xff0c;但是又有多少人真正了解银行呢&#xff1f; 通过本书你可以学习到&#xff1a;银行不为外人了解的内部运营机制&#xff0c;甚至可以提前把握银行涨息降息政策规律 银行运营的基础逻辑 “运营”二…

泉城济南的隐秘珍宝与山东旅游必去十大景点

泉城济南的隐秘珍宝与山东旅游必去十大景点 济南&#xff0c;这座历史悠久的城市&#xff0c;不仅以其丰富的人文底蕴著称&#xff0c;还拥有诸多引人入胜的自然景观。在这片华夏神州广阔的齐鲁大地上&#xff0c;济南特别以其“三无风景区”——无影山、无影潭、无影泉——而闻…

ON DUPLICATE KEY UPDATE 子句

ON DUPLICATE KEY UPDATE 是 MySQL 中的一个 SQL 语句中的子句&#xff0c;主要用于在执行 INSERT 操作时处理可能出现的重复键值冲突。当尝试插入的记录导致唯一索引或主键约束冲突时&#xff08;即试图插入的记录的键值已经存在于表中&#xff09;&#xff0c;此子句会触发一…

neo4j 3.5.5版本创建新的数据库

neo4j 3.5.5版本创建新的数据库 1.找到neo4j的conf文件 点进去 2.点击neo4j.conf 选择记事本打开 3.把graph.db换成自己想要创建的数据库名称 4.打开neo4j服务 出现新的数据库

AI Agent 热门的10篇论文

人工智能代理领域广阔,涵盖广泛的主题,包括多代理系统、强化学习、上下文感知系统以及将大型语言模型 (LLMs) 集成到基于代理的系统中。以下是 arXiv 的一些顶级论文,涵盖了人工智能代理的各个方面: A Framework For Intelligent Multi Agent System Based Neural Network …

rman恢复后,少部分数据文件状态为MISSING000**

客户有套一体机&#xff0c;每天晚上21点开始做rman完全备份&#xff0c;大约第2天上午9点多完成备份&#xff0c;rman备份保留策略保留一份完全备份 6月1日晚21点自动发起备份&#xff0c;6月2日上午10点15分完成备份&#xff0c;并生成了一个控制文件备份 c-4063271871-2024…

量产导入 | KGD 是什么?

文章目录 KGD 是什么&#xff1f;认识KGD定义、功能与应用实例【白话文解析】Known Good「Die」何谓良品裸晶粒 &#xff08;KGD/KGD Die&#xff09;&#xff1f;解读KGD产业应用为什么大家纷纷采用KGD&#xff1f; 一窥KGD与芯片封测大趋势 KGD 是什么&#xff1f;认识KGD定义…

【Linux系统】线程与线程控制

本篇博客整理了Linux下线程的概念、线程控制的相关接口&#xff0c;旨在让读者初步认识线程&#xff0c;并为下一篇多线程作铺垫。 目录 一、线程是什么 1.线程是进程的执行流 2.线程的执行、调度、切换 3.页表分级与线程资源分配 4.线程的优缺点 二、线程控制 1.创建…

mmdeploy环境部署流程

参考&#xff1a;mmdeploy/docs/zh_cn/01-how-to-build/linux-x86_64.md at main open-mmlab/mmdeploy (github.com) 从零入门《openmmlab》mmdeploy[1]环境安装及简单上手_哔哩哔哩_bilibili 我的环境&#xff1a; docker容器&#xff0c;ubuntu20.04&#xff0c;cuda11.7…

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

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

从盛世到衰落,历史上八大强国的兴衰与现代地位!

人类文明史悠久&#xff0c;从远古时代至今日&#xff0c;世界舞台上曾经涌现出许多强盛的帝国。它们在自己的黄金时代&#xff0c;曾经无人能敌&#xff0c;不论是在军事、经济还是文化上都独领风骚。然而&#xff0c;无论多么强大的国家也难逃“兴盛必衰”的命运。今天&#…

javaWeb项目-在线考试系统详细功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java简介 Java语…

ArcGIS 10.8软件安装包免费下载及安装教程

安装包获取&#xff1a; 【软件名称】&#xff1a;ArcGIS 10.8 【安装包链接 】&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/2240330bf935 提取码&#xff1a;Yixn 【备用链接】&#xff1a; 链接:https://pan.baidu.com/s/13V5o_igcK0suW4SFsWkxeQ?pwdj6kx 提取码…