什么是静态链接?有什么用?

文章目录

  • Linux下的链接器:ld
    • ld的作用
  • 可重定位目标文件
    • 可重定位目标文件的结构是怎么样的?
      • 1. 文件头(File Header):
      • 2. 节头表(Section Header Table):
      • 3. 节区(Sections):
      • 4. 符号表(Symbol Table):
      • 5. 重定位表(Relocation Table):
  • 命令行参数
  • 可执行文件
  • 链接器的输入和输出
  • 完成链接的两个主要任务
    • 1.符号解析(symbol resolution)
      • 什么是符号?
      • 什么是符号解析(Symbol Resolution)?
    • 2.重定位(relocation)
      • 在静态链接器中完成重定位
  • 什么是静态链接?有什么用?
  • 参考资料

Linux下的链接器:ld

LD 指的是 Linux 下的链接器(Linker,也称 ld)。

它是将由编译器生成的目标文件链接在一起形成可执行文件或库的程序。

ld的作用

1.链接器用于解决目标文件和库之间的外部引用,合并多个目标文件,并生成最终的可执行文件或库文件。

2.链接器还负责将可执行文件加载到内存中,并将其与任何所需的共享库链接在一起。

它是软件开发过程的关键部分,对于在 Linux 上创建可执行程序和库来说是必不可少的。

可重定位目标文件

可重定位目标文件是一种二进制文件,其中包含了程序的代码和数据。

可重定位目标文件的结构是怎么样的?

下面是一个简单的可重定位目标文件的结构示意图:

+---------------------+
|      File Header     |
+---------------------+
|   Section Header 1   |
+---------------------+
|   Section Header 2   |
+---------------------+
|         ...         |
+---------------------+
|   Section Header n   |
+---------------------+
|      Section 1      |
+---------------------+
|      Section 2      |
+---------------------+
|         ...         |
+---------------------+
|      Section n      |
+---------------------+
|      Symbol Table   |
+---------------------+
|    Relocation Table  |
+---------------------+

这个文件由许多不同的节(section)组成,每一节都是一段连续的字节序列,其中存储了相应的代码和数据。这些节包含了程序中的不同部分,例如指令、数据、符号表、重定位表等等。

这些节可以在链接时被合并,生成可执行文件,或者在运行时被动态加载,成为进程的一部分。

可重定位目标文件的结构通常分为以下几个部分:

1. 文件头(File Header):

包含文件类型、目标机器类型、节头表的起始地址等信息。

2. 节头表(Section Header Table):

描述了所有节的的属性信息,如节的名称、大小、类型、所在段等等。

3. 节区(Sections):

包含了程序的代码和数据,每个节区都有一个节头表项与之对应。

在可重定位目标文件中,程序储存在不同的节(section)中,不同类型的全局变量可能会被分配到不同的节中。

在可重定位目标文件中,指令通常存储在一个叫做“.text”的节中,已经初始化的全局变量通常存储在“.data”或“.rodata”节中,未初始化的全局变量通常存储在“.bss”节中。

这是因为在编译时,编译器会将代码和数据分别打包成不同的节,以便于在链接时更好地进行目标文件的组合。

同时,不同的目标文件中也可能出现相同名称的函数或变量,这时在链接时需要进行符号解析和重定位,保证最终生成的可执行文件能够正确地执行。
在这里插入图片描述

4. 符号表(Symbol Table):

存储了所有定义和引用过的符号、符号的类型、值、所在节等信息。

5. 重定位表(Relocation Table):

描述了需要重定位的节区和需要进行重定位的位置。

命令行参数

命令行参数指的是用户在命令行上输入给Linux ld程序的参数,这些参数可以控制Linux ld程序的行为,如告诉程序链接哪些目标文件、链接生成什么类型的可执行文件、使用哪种链接脚本等等。常见的ld参数包括:

-o:指定输出文件名
--entry:指定程序入口点
-L:指定搜索库文件的路径
-l:指定要链接的库文件
-Bstatic/-Bdynamic:指定静态/动态链接
-T:指定链接脚本文件
这些参数可以通过man ld查看Linux ld程序的使用手册获得更详细的信息。

可执行文件

可执行目标文件也称为可执行文件,是经过链接后的目标文件。

包含了程序的执行代码、数据和程序入口等信息,可以直接被计算机加载和执行。

在Linux系统中,可执行文件通常以ELF格式存储(也可以是其他格式,如COFF、Mach-O等)。

执行可执行目标文件时,操作系统会将其加载到内存中,并从程序入口开始执行。

可执行文件可以是应用程序、脚本、驱动程序等各种类型的程序。

链接器的输入和输出

像 Linux ld程序这样的静态链接器(static linker)以一组可重定位目标文件命令行参数作为输入,生成一个完全链接的、可以加载和运行的可执行目标文件作为输出。

完成链接的两个主要任务

为了构造可执行文件,链接器必须完成两个主要任务:

1.符号解析(symbol resolution)

什么是符号?

在编译器的语境中,符号(Symbol)是指用户定义的名称、变量、函数、类、模块等实体的名称,也可以理解为程序中标识某个变量或函数的标签或名字。

在编译器将源代码转化为目标文件的过程中,编译器会将这些符号存储在目标文件的符号表中。在链接时,链接器会读取多个目标文件中的符号表,并将它们合并起来,以便能够在程序中正确地访问各个变量和函数。

什么是符号解析(Symbol Resolution)?

符号解析(Symbol Resolution)是指在链接阶段确定每个符号最终所代表的地址或实现,并将符号引用替换成符号定义,从而使得程序能够正确地运行。它通常包括符号查找(Symbol Lookup)、符号绑定(Symbol Binding)、符号重定位(Symbol Relocation)等过程。

2.重定位(relocation)

重定位(Relocation)是指将程序中的符号引用或地址引用映射到目标地址的过程。

在程序编译的过程中,编译器会将程序中用到的符号和地址表示为相对地址或偏移量,这些相对地址或偏移量需要在程序运行时动态地映射到实际的绝对地址上,这个过程就是重定位过程。

具体来说,当编译器生成目标文件时,它会在目标文件中为每个符号分配一个相对于目标文件起始地址的地址。当目标文件被加载到内存中时,操作系统会为目标文件的每个节(section)分配一段连续的内存空间,并将目标文件中每个符号的相对地址加上该节的起始地址,得到该符号在内存中的绝对地址,这个过程就是重定位过程。

在静态链接器中完成重定位

重定位通常在链接器中完成,包括静态链接器和动态链接器。这里先不讨论动态链接器。

静态链接器在将多个目标文件链接成一个可执行文件时会进行重定位。

重定位是将程序中的相对地址映射到实际的绝对地址的过程,是程序在运行时动态映射内存地址的重要步骤之一。

什么是静态链接?有什么用?

到这里我们可以开始总结了,什么是静态链接?有什么用?

静态链接是将程序的所有模块(包括目标文件和库文件)在编译阶段之后的链接阶段合并为一个单独的可执行文件的过程。

在这个过程中,符号引用被解析并绑定到相应的地址,生成一个包含完整代码和数据的独立可执行文件。

主要用途:

  1. 生成独立可执行文件: 静态链接生成一个完全独立于其他文件的可执行文件,不需要依赖外部库或模块。

  2. 提高执行速度: 由于所有代码和数据都被合并到一个文件中,避免了运行时的模块加载和地址解析,因此可能提高程序的执行速度。

  3. 便于分发: 静态链接的可执行文件包含了所有必要的代码和数据,使得程序更容易分发和部署,因为用户只需要一个文件就能运行整个程序。

  4. 符号隐藏: 静态链接将所有模块合并在一起,可以隐藏模块的内部实现细节,只暴露公共接口,提高代码的安全性。

静态链接的缺点包括生成较大的可执行文件以及每次更新都需要重新链接。这导致在一些场景中,如大型应用程序或者涉及到频繁更新的情况下,动态链接可能更为常见。

参考资料

《深入理解计算机系统》

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

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

相关文章

消费数据可视化大屏,助力金融机构智慧运维

在今天的数字化时代,消费数据的可视化已经成为了一种重要的趋势。通过将消费数据以图表、图像等形式展现出来,可以帮助我们更直观地了解消费者的行为和趋势。同时,这也为企业提供了更多的分析和决策依据。无论是针对市场营销策略的制定&#…

安卓ncnn部署分割模型

任务:使用ncnn部署分割模型 准备工作 torch转成onnx模型,略~使用onnxsim简化onnx模型;onnx转ncnn模型,网址https://convertmodel.com/ 准备工作完毕,部署 本文代码链接,先看效果图,这是一个…

【漏洞复现】速达软件存在任意文件上传

漏洞描述 速达软件全系产品存在任意文件上传漏洞,未经身份认证的攻击者可以通过此漏洞上传恶意后门文件,执行任意指令,造成服务器失陷 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、…

kafka 3.x 学习笔记

kafka 3.x 学习笔记 在 kafka 2.8.0 版本之前,安装使用 kafka 需要配套安装 zookeeper,但在 2.8.0 版本之后,不再需要安装 zookeeper,本次学习笔记采用的 kafka 版本为 3.0.0。 文章目录 kafka 3.x 学习笔记一、kafka 定义1 什么是…

win10打开或关闭系统图标界面网络显示灰色

1、右击任务栏,选择任务管理器,或同时按下键盘上的“CtrlShiftEsc”组合键打开任务管理器; 2、在任务管理器【进程】选卡下找到【资源管理器】,单击右键,选择【重新启动】即可。 等待桌面和任务栏全部消失&#xff0c…

Python中读写(解析)JSON文件的深入探究

目录 一、引言 二、如何读取JSON文件 三、如何写入JSON文件 四、如何解析JSON字符串 五、错误处理和异常处理 六、使用第三方库提高效率 七、总结 一、引言 在Python中,我们经常使用JSON(JavaScript Object Notation)格式来存储和传输…

【开源】基于Vue.js和微信小程序的班级考勤管理系统

文末获取源码,项目编号: S 080 。 \color{red}{文末获取源码,项目编号:S080。} 文末获取源码,项目编号:S080。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支…

链表|2. 两数相加160. 相交链表 234. 回文链表

2. 两数相加 题目:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0…

如何将整个文件内容加载到富文本控件?

众所周知,富文本控件,Rich Text Control,用来呈现文本内容的一个控件,功能上相对记事本来说更加丰富,但又不及 Word。 但,我们的目标又不是开发另外一个 Word。 我们可以使用 EM_STREAMIN 消息将整个文件…

_____面试题_____(持续更新)

连表的链接方式 # 左连接 left join on # 右连接 right join on # 内连接 inner join on # 全连接 full join on # 笛卡尔积 join ------------------------------------------------ 上面讲的都是连表方式,连表的目的是查询,连表的依据是表和表…

一文讲透Python机器学习决策树算法的基本概念与原理

1.决策树算法的基本特点与优势 决策树算法是一种有监督、非参数、简单、高效的机器学习算法。相对于非监督式学习方法,决策树算法由于充分利用了响应变量的信息,因此能够很好地克服噪声问题,在分类及预测方面效果更佳。决策树的决策边界为矩…

联想电脑重装系统Win10步骤和详细教程

联想电脑拥有强大的性能,很多用户办公都喜欢用联想电脑。有使用联想电脑的用户反映系统出现问题了,想重新安装一个正常的系统,但是不知道重新系统的具体步骤。接下来小编详细介绍给联想电脑重新安装Win10系统系统的方法步骤。 推荐下载 系统之…

三大兼容 | 人大金仓兼容+优化MySQL用户变量特性

目前,KingbaseES对MySQL的兼容性,已从功能兼容阶段过渡到强性能兼容、生态全面兼容阶段,针对客户常常遇到的用户变量问题,KingbaseES在兼容MySQL用户变量功能的基础上,优化了MySQL用户变量的一些原生问题,使…

【上海大学数字逻辑实验报告】四、组合电路(三)

一、 实验目的 掌握多路选择器74LS151的原理。掌握译码器74LS138的原理。学会在Quartus II上使用多路选择74LS151设计电路。学会在Quartus II上使用译码器74LS138设计电路。 二、 实验原理 多路选择器又称数据选择器或多路开关,它是一种多路输入单路输出的组合逻…

JS实现成才网注册系统(网页数据验证)

主代码 <!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Conten…

Spring Cloud + Vue前后端分离-第3章 SpringBoot项目技术整合

Spring Cloud Vue前后端分离-第3章 SpringBoot项目技术整合 3-1 集成持久层框架Mybatis ORM:对象关系映射&#xff0c;Hibernate是全自动ORM&#xff0c;Mybatis是半自动ORM&#xff0c;Mybatis可以操作的花样更多&#xff0c;是首选的持久层框架 System模块集成Mybatis框架…

基于yolov8-道路裂缝检测

1 介绍 本文主要是搜集数据&#xff0c;从网上kaggle等网站找了2000多张图片&#xff0c;然后使用yolov8模型进行训练&#xff0c;最后只展示训练过程中的图片&#xff0c;如果有需要&#xff0c;可以联系&#xff1a;https://docs.qq.com/doc/DWEtRempVZ1NSZHdQ。

11-30 SpringBoot2

热部署 开发过程中,修改代码,不需要重启,自动更新 项目上线,一定要关闭 SpringBoot热部署的实现&#xff1f;&#xff1f; ideal默认阻止class类更新 2&#xff0e;需要手动构建项目&#xff0c;可以使用快捷键激活此功能ctrl F9 / build project 自动构建项目 允许程序运行…

02、pytest环境准备

工具准备 python官网下载&#xff1a;https://www.python.org/pycharm官网下载&#xff1a;https://www.jetbrains.com.cn/en-us/pycharm/pytest官方文档&#xff1a;https://docs.pytest.org/en/7.4.x/python-office官网文档&#xff1a;http://www.python-office.com/ 参考…

数学建模-二氧化碳排放及时空分布测度

二氧化碳排放及时空分布测度 整体求解过程概述(摘要) 面临全球气候变化的巨大挑战&#xff0c;我国积极响应《巴黎协定》的号召&#xff0c;提出“2030年前碳达峰&#xff0c;2060 年前实现碳中和”的碳排放发展目标&#xff0c;并将碳中和相关工作作为 2021 年的重点任务之一…