链接器 --- Linker

article/2025/10/13 17:37:34

链接器

1. 背景

​ 对于经常使用 IDE 的开发者,通常点击一个按钮就万事大吉了,这虽然极大简化了过程,但是对于我们C语言这些相对底层的开发者来说非常非常不友好,屏蔽了大量细节,不了解内部细节是非常可怕的,因此,非常有必要探究其原理。

2. 知识储备

  • 将C代码生成可执行目标文件需要经过4个步骤
  • 其中需要编译工具链来翻译我们写的代码
  • 编译工具链其实也就只是程序,只不过是用来将我们人能够读懂的代码翻译成机器码的程序
    在这里插入图片描述
  • 预处理:使用预处理器将头文件、宏定义,原封不动的直接展开在当前文件中,并生成 .i 文件
  • 编译:使用编译器将 .i 文件翻译成汇编语言文件 .s
  • 汇编:使用汇编器将 .s 翻译成一个可重定位目标文件(relocatable obj file).o
  • 链接器:闪亮登场!本文重点研究下链接器 ld,因为链接器非常重要,需要经常使用,将一系列 .o 文件组合起来,创建出可执行目标文件(executable object file)

3. 什么是链接器(Linker)

​ 借用深入理解计算机系统一书中的解释:以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的、可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成,每一个节都是一个连续的字节序列。指令在一个节中,初始化了的全局变量在另一个节中,而未初始化的变量又在另外一个节中。

​ 节其实就是一个区域

​ 有点类似 Linux 下的归档工具 tar,将多个文件集合起来,但这仅仅是 Linker 的作用之一,还有个作用就是重定位!

4. 可重定位目标文件里到底是啥?

在这里插入图片描述

​ 上面这副图就是目标文件中装的东西

  • .text:指令(汇编指令,C函数翻译后得来,局部变量其实就是指令的操作数)放在 text 段
  • .data:初始化的全局变量与静态变量放着 data 段
  • .bss:未初始化或初始化为0的全局变量与静态变量
  • .rodata:使用 const 关键字修饰的变量
  • .symtab:符号表!它存放程序中定义、引用的函数、全局符号的信息。每一个 .o 都有一个符号表,记录着自己定义和全局变量符号、自己定义的函数符号与引用别人的符号(变量与函数),就是因为这张表的存在,链接器才能够将大量的 .o 文件链接起来生成可执行文件。
  • 其他不深究

5. 符号和符号表

​ 每一个可重定位目标模块m都有一个符号表,它包含m定义和引用的符号的信息。在链接器的上下文中,有三种不同的符号:

  • 由模块m定义应能够被其他模块引用的全局符号

  • 由其他模块定义并被模块m引用的全局符号。 这些符号称为外部符号, 对应于在其他模块中定义的非静态C函数和全局变最

  • 只被模块m定义和引用的局部符号。 它们对应于带 static属性的C函数和全局变 量。 这些符号在模块m中任何位置都可见, 但是不能被其他模块引用。

6. 符号决议

​ 符号表给 Linker 提供了两种信息,一个是当前目标文件可以提供给其他目标文件使用的符号,另一个是其他文件需要提供给当前目标文件使用的符号。有了这些信息,链接器就能够进行符号决议了。

​ 对于那些引用定义在相同模块(同一目标文件)中的局部符号的引用,符号解析是非常简单明了的。编译器只允许每个模块中的每个局部符号只有一个定义。静态局部变量也会有本地链接器符号, 编译器还要确保它们拥有唯一的名字。

​ 全局符号的引用解析就棘手很多了,当编译器遇到一个不是在当前模块中定义的符号时,会假设该符号是在其他某个符号中定义的,生成一个链接器符号表条目,并把它交给链接器处理。如果链接器在它的任何输入模块中都找不到这个被引用的符号的定义,就输出一条错误信息,并终止。

7. 链接静态库

未完持续。。。。。。

8. 重定位

未完持续。。。。。。


http://chatgpt.dhexx.cn/article/BcYTtlqY.shtml

相关文章

arm-gcc链接器和链接脚本

本文主要介绍了链接器和链接脚本的基本内容。主要偏向于入门级以及常见容易混淆的知识点。 1. 链接器介绍 在现在软件工程中,程序一般都比较复杂,通常由多个源文件组成。在编译的过程中会对这些源文件进行汇编或者编译然后生成目标文件。这些目标文件一…

彻底理解链接器:一

目录 什么是链接器(Linker) 链接器可操作的元素 链接器是如何工作的 过程一:符号决议 c源文件中都有什么 目标文件里有什么 符号表(Symbol table) 符号表存放在哪里 符号决议的过程 实例说明undefined reference 过程二&#xff1…

【python】pip指定路径安装文件

在网上下载个tar.gz的安装包,用pip在指定目录安装 pip install --target路径 文件名 pip install --targetE:\work\zicai\pd_code\AutoTest3.7\shujia\venv\Lib\site-packages xlwings-0.18.0.tar.gz 指定下载pyecharts包1.7.0版本到执行路径 pip3 install -i h…

如何查看Ubuntu中Python的安装路径

ubuntu查看python安装路径 查找方法: python import sys pythonpath sys.executable print(pythonpath)Python的安装路径:/usr/bin/python 可提供远程搭建运行服务 不会调试运行的同学,你只需打开远程,会帮你搭建调试好一切&a…

如何找到python 安装路径

我觉得第二个方法更实用,直接按个快捷键F8就行了 第一个:打开python,或者命令行 输入 import sys for i in sys.path: ... print(i) 输出 C:\Users\ASUS\AppData\Local\Programs\Python\Python37\python37.zip C:\Users\ASUS\AppDat…

找Python安装目录,设置环境路径以及在命令行运行python脚本

第一点:找Python安装目录 方法一: 方法二: 输入import sys print(sys.path) 化黑线处 第二点:找到安装目录后就可以开始设置环境变量 这里我的安装目录为C:\Program Files\Python36 再字符串的末尾&…

如何查看Python的安装路径

如何查看Python的安装路径 打开cmd,输入python -m site 发现我的Pyhton安装路径就是:C:\Users\XXXXX\AppData\Local\Programs\Python\Python38

【windows环境下】如何将python模块安装到指定目录下

当你只安装了一个版本的python的时候只需要用 pip install [模块名]就可以安装模块 当存在多个python环境,要将模块添加到某个环境下 可以使用下面的代码 pip install -t [路径]\ [模块名]其中的路径是你选择的环境python所在的安装目录 一般在python下的Lib目录…

下完安装好python后,想查看python的安装位置的几种方法

查看python的路径 基于windows系统,按下winr(也就是命令提示符),输入cmd ,进入 查看当前的python的版本的话输入python -V 1, 查看当前下载的python类型和路径则可以输入 py -0 (加 * 的是你使用python的默…

python安装路径怎么找-怎么查看python安装路径

查看python安装路径的方式:1、在桌面上右击Python软件图标,点击“打开文件所在的位置”,即可直接跳转到安装目录;或是右击之后点击“属性”,查看安装路径。2、在“任务管理器”中找到Python应用,右击选择“打开文件所在的位置”,打开软件的安装位置。 Python是一种脚本语…

cd对Python安装目录操作

1.Python安装路径查询:cmd中使用指令:py -0p 2.cmd操作: 切换当前盘:D: 进入当前盘文件:cd空格位置 返回上一级目录:cd ..

Python安装目录详解

最常用到的就是图中标出的python参考文档与python的标准库。 具体: DLLs:python的动态链接库,跟编译器有关,和python 编程关系不大 Doc:python的参考书,有很多实例 lnclude:python编译器的C语言源码 Lib:…

如何查看python安装路径

在使用python的时候,有时候会需要找到python包的安装位置,来找其他安装的第三方包。下面我们来看看,在不同平台上,怎么找到python的安装路径。 很多运行的系统软件都是建立在python的基础之上,如果python出错了&#…

python的默认安装位置查询

一般你默认安装的话,python的安装路径是在如下的路径 C:\Users\[你的用户名]\AppData\Local\Programs\Python 如图:

Python安装后目录在哪儿_如何查看Python的安装目录

一、Python的安装录 当前安装版本为:python 3.10.4 1.在安装python的时候可以看到安装目录,可以修改安装目录: 2.windows系统下64位安装目录如下: 跟其他软件不太一样,没有安装在PragrameFiles文件夹中 C:\Users\Ad…

状态转移矩阵求解

状态转移矩阵的求解 例: 求状态转移矩阵。 STEP1:写出齐次方程。 ① ② STEP2:求方程在条件下的解:。 STEP3:取线性无关的初始状态,求出基本矩阵。 取时: 取时: 由于两个初始状…

GIS应用技巧之制作土地利用转移矩阵表

一、前言 土地利用数据是反映土地利用系统及土地利用要素的状态、特征、动态变化、分布特点,以及人类对土地的开发利用、治理改造、管理保护和土地利用规划等数据资料。 土地利用作为全球的研究重点,然而对于土地利用编号最直观的体现就是土地利用转移…

利用ArcGIS做土地利用转移矩阵

今天来分享如何在ArcGIS里做土地利用转移矩阵,选用的数据为山西省GLobeland 30的土地利用产品,选用时期为2010年和2020年,原始数据下载地址为http://globeland30.org/。 产品的土地利用类型有耕地、森林、灌木丛、湿地、水体、人造地表和裸地…