第七章.链接

news2024/11/18 13:52:47

概述

  • 链接:将多个目标文件或库文件组合在一起,生成可执行文件或共享库
    可以执行于编译时、加载时、运行时,使得分离编译成为可能,由链接器自动实现
  • 链接器:将各个模块之间的符号引用解析为实际的内存地址,生成可执行文件或共享库。
    在这里插入图片描述

目标文件

可执行目标文件

  • 是经过链接过程后生成的最终可执行文件,可以直接加载到内存中执行,不需要进一步链接。
  • 包含了程序的完整机器代码、数据和其他必要的信息。

共享目标文件

  • 是一种特殊的目标文件,包含了可供多个程序共享的代码和数据。
  • 通常由编译器和链接器生成,并在运行时由动态链接器加载到内存中。
  • 可以被多个进程加载和使用,节省了存储空间并提供了代码的复用性

DLL(动态链接库)共享库都是共享目标文件,但有以下区别:

  • 操作系统支持:DLL主要用于Windows,共享库主要用于类Unix系统(如Linux、MacOS等),在Linux中用.so后缀
  • 文件格式:DLL采用PE(Portable Executable)文件格式,而共享库采用ELF(Executable and Linkable Format)文件格式。
  • 符号解析:DLL使用的是"stdcall"或"cdecl"的调用约定,而共享库一般使用标准的C调用约定。
  • 运行时链接:DLL在程序运行时动态链接到内存中,而共享库可以在程序加载时静态链接,也可以在运行时动态链接。

可重定位目标文件

  • 是编译器生成的中间文件,包含了已编译的源代码的机器代码和相关的符号信息,还没有进行最终的链接和加载操作,可以被进一步链接成可执行文件或共享目标文件
  • 主要用于静态链接,通过链接器将多个目标文件合并成一个可执行文件。

ELF(Executable and Linkable Format)可重定位目标文件是一种常见的二进制文件格式,用于存储编译后的可执行程序的中间结果。

在这里插入图片描述

  • ELF文件头(ELF Header):包含了关于ELF文件的基本信息, 如文件类型、目标体系结构、入口点地址等。

  • 节头部表:包含了每个节的描述信息

  • .text节:已编译程序的可执行代码,通常是只读的

  • .rodata节:只读数据

  • .data节:已初始化的全局和静态变量的数据。局部变量保存在栈中

  • .bss节:未初始化的全局和静态变量的数据, 这些变量在目标文件中不占据磁盘空间、在程序运行时会被初始化为零。

  • .symtab节:符号表,存储了程序中定义和引用的各种符号(如函数、变量)的信息。 与编译器中的符号表不同,它不包含局部变量的条目

  • .rel.text节和.rel.data节:代码和数据的重定位信息, 任何调用外部函数或引用全局变量的指令都需要修改

  • debug节:调试符号表,存储了调试信息,包括源代码行号、变量名和类型信息等。

  • line节:C程序的行号与.text中机器指令之间的映射

  • strtab节:字符串表,存储了ELF文件中使用的字符串, 包括symtab和debug的符号表、节头部表

符号

三种符号

  • 由模块m定义并能被其他模块引用的全局符号
  • 外部符号:由其他模块定义并被模块m引用的全局符号
  • 局部符号 :只被模块m定义和引用

符号表

管理符号信息

在这里插入图片描述
Value:对于可重定位模块,是位置偏移;对于可执行目标文件,是绝对地址

三个伪节:
- ABS(Absolute Symbol):代表了已知的固定地址,代表一个绝对地址的符号,它的地址在链接时已经确定,不需要进行重定位。ABS符号通常用于表示具有固定地址的全局变量或常量。

- UNDEF(Undefined Symbol):代表了需要在链接时解析的未定义符号,即在当前模块中引用的符号,但其定义在其他模块中。

- COMMON:用于处理多个模块中的共享变量,用于表示在多个模块中定义的全局变量,但每个模块中的变量大小可能不同。在链接时会被合并,分配合适的内存空间,以保证各个模块中对该变量的引用都指向同一个地址。

静态链接

符号解析

解决模块之间的符号引用。将符号的引用与符号的定义进行匹配,以确定符号在内存中的地址。

强符号:函数、已初始化的全局变量
弱符号:未初始化的全局变量

规则

  • 不许多个同名的强符号
  • 一强多弱,则选强
  • 多弱,则任选一个

若x是强int、弱double,则可能挤占下一个变量的地址

符号重定位

将目标文件中的未定义符号与其他目标文件或库文件中的定义符号进行关联。

重定位

将每个符号定义和一个内存位置关联。
合并相同类型的节,并赋予内存地址;修改对符号的引用,使之指向正确的运行时地址

符号重定位解决了符号引用的关联问题,重定位解决了代码和数据的位置调整问题

重定位条目:告诉链接器在将目标文件合并成可执行文件时如果修改引用

在这里插入图片描述

//重定位使用PC相对地址的引用
if(r.type==R_x86_64_PC32)
    refaddr = ADDR(s) + r.offset;//ref's run-time address 
    *refptr = (unsigned)(ADDR(r.symbol)+ r.addend - refaddr);
//重定位使用绝对地址的引用
if (r.type==R_x86_64_32)
    *refptr = (unsigned)(ADDR(r.symbol)+ r.addend);

静态库

常见的静态库文件格式包括Linux系统下的.a(Archive)文件和Windows的.lib(Library)文件。

  • 独立性:静态库将目标文件打包在一个归档文件中,使得库文件与可执行文件独立,不依赖于系统环境或其他库文件。

  • 静态链接:在编译时,将静态库中的目标文件直接复制到可执行文件中,形成一个完整的可执行文件。这样,程序在运行时不需要额外加载和链接库文件。

  • 提高执行速度:由于静态库已经在编译时被链接到可执行文件中,因此程序的执行速度相对较快,不需要额外的库加载和链接过程。

  • 简化发布和部署:将程序所需的所有依赖都包含在静态库中,使得程序的发布和部署变得更加简单和方便。

静态库的使用方式是在编译时将库文件链接到可执行文件中,使得程序能够调用库中提供的函数和功能。在静态库中可以包含多个模块或功能,程序可以选择性地链接所需的模块。

需要注意的是,静态库的使用会增加可执行文件的大小,并且不支持动态更新库文件。如果库文件发生更新或修复,需要重新编译和链接整个程序。

符号解析阶段,命令行上的库和目标文件的顺序很重要,否则引用不会被解析

加载可执行目标文件

加载:将程序复制到内存并运行

在这里插入图片描述

动态链接

  • 将目标文件和库文件的机器码保留为独立的模块,运行时按需向内存中加载和链接库文件。
  • 允许多个可执行文件共享同一个库文件的实例,节省了内存空间,使系统更加灵活和可维护。

位置无关代码(PIC)

PIC数据引用

数据段和代码段的距离总是保存不变
在数据段开始的地方创建一个表,称为全局偏移量表(GOT)

PIC函数调用

延迟绑定:将过程地址的绑定推迟到第一次调用该过程时
第一次调用过程的运行时开销很大,但其后的每次调用都只花费一条指令和一个间接的内存引用
全局偏移量表(GOT)是数据段的一部分;过程链接表(PLT)是代码段的一部分

在这里插入图片描述

库打桩机制

允许截取共享库函数的调用,取而代之自己的代码

  • 编译时(需要能够访问源代码)
  • 链接时(需要能够访问可重定位对象文件)
  • 运行时(需要能够访问可重定位目标文件)

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

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

相关文章

大厂面试官带你Get求职面试核心技巧

本文首发自[慕课网] ,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"及“慕课网公众号”! 作者:Brain|慕课网名师 Hello,大家好,我是Brian 老师,在开发领域摸爬滚…

Day01 关系型数据MySQL简介与多平台安装配置

在大数据的课程中,我们需要处理的数据来自不同的渠道,其中有一个很重要的渠道就是关系型数据库中存储的数据。在企业中,会把业务数据存储在关系型数据库中,一般以MySQL居多。另外,我们在后续的课程中需要学习Hive、Spa…

SpringBoot启动过程源码解析

一,构造SpringApplication对象 1、推测web应用类型 如果项目依赖中存在org.springframework.web.reactive.DispatcherHandler,并且不存在org.springframework.web.servlet.DispatcherServlet,那么应用类型为WebApplicationType.REACTIVE如果…

【PaLM2】PaLM2 大语言模型与 Bard 使用体验

欢迎关注【youcans的学习笔记】原创作品,火热更新中 【Google I/O 2023】PaLM2 大语言模型与 Bard 使用体验 1. PaLM2 大型语言模型1.1 谷歌发布 PaLM21.2 PaLM2 的功能与性能 2. 基于 PaLM2 的谷歌 AI 产品2.1 智能助手 Duet AI2.2 Gmail:帮我写邮件2.3…

【Spring框架四】——Spring AOP 注解实现和xml方式实现

系列文章目录 【Spring框架一】——Spring框架简介 【Spring框架二】——什么是Spring IOC、 什么是Spring 依赖注入 【Spring框架三】——Spirng IOC和DI的实现 Spring AOP 注解实现和xml方式实现 系列文章目录前言一、什么是Spring AOP(Aspect-Oriented Progra…

OpenAI 宣布推出适用于 iPhone 和 iPad 的 ChatGPT 官方应用程序。

🚀 OpenAI 宣布推出适用于 iPhone 和 iPad 的 ChatGPT 官方应用程序。 OpenAI 宣布推出适用于 iPhone 和 iPad 的 ChatGPT 官方应用程序。 该应用程序具备即时回答各种问题、量身定制的建议、创意灵感、专业意见和个性化学习等功能和特性,可以帮助提高…

【密码产品篇】服务器密码机密钥体系结构

【密码产品篇】服务器密码机密钥体系结构 标准GM/T 0030-2014中规定服务器密码机必须至少支持三层密码体系结构,包括:“管理密钥、用户密钥/设备密钥/密钥加密密钥、会话密钥”。除"管理密钥"外,其他密钥可被用户使用,…

在图片上添加水印的四个方法

如何在图片上添加水印?在当今开放的互联网环境中,平时对于图片的使用已经变成非常广泛,越来越多的人开始关注图片的版权问题。如今,人们越来越注重防盗意识,这是因为我们在网上发布的图片很容易被别有用心之人盗用&…

Maven仓库

1、仓库 仓库:用于存储资源,主要是各种jar包 关于仓库,我们前面讲到了有三种:本地仓库,私服,中央仓库,其中私服和中央仓库都属于远程仓库 中央仓库:maven团队自身维护的仓库&#…

Java面试知识点(全)- Java并发-多线程JUC一

Java面试知识点(全) 导航: https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 JUC框架 五个部分: 主要包含: (注意: 网上找的图,主体上可以看出其分类关系也够了) Lock框架和Tools类(把图中这两个放到一起…

一起Linux操作系统部署的Mysql数据库服务器/目录空间占用异常的分析事例

一台Linux操作系统部署的Mysql数据库服务器平时“/"目录占用很低,但每个小时都会出现一次根目录空间占用高的情况,本文系从OS侧对异常事件进行分析排查的过程。 1、初步分析 主机已进行监控,分析监控图表 可见该数据库服务器日常根目录…

王炸功能ChatGPT 联网插件功能放开,视频文章一键变思维导图

就在上周5月13日,Open AI 发文称:“我们将在下周向所有ChatGPT Plus 用户开放联网功能和众多插件”。 这意味着什么? 首先联网功能将使得ChatGPT不再局限于回答2021年9月之前的信息,能直接联网查询最新消息。 而插件功能就可以在…

基于LT6911UXC的LVDS视频接口调试经验

项目方案采用龙讯半导体LT6911系列。 该方案采用HDMI输出转LVDS接口。在本方案中有两种显示屏;一个是10.4寸,一个是15.6寸。分别应 单LVDS与双LVDS接口。 10.4寸屏幕的分辨率为1024*768;单八LVDS信号; 15.6寸的屏幕的分辨率为19…

SSD202D-MIPI屏点亮

调试mipi 点屏参考 - SigmaStarDocs Panel开发参考 - SigmaStarDocs 1.首先要看点屏参考,看懂硬件接线这些原理,然后依据实际的接线配置屏参 和RGB是复用的,所以不一样, 然后配置内核,我是直接编译mipi的内核 2.配置屏参,

如何进行测试分析与设计-HTSM启发式测试策略模型 | 京东云技术团队

测试,没有分析与设计就失去了灵魂; 测试人员在编写用例之前,该如何进行测试分析与设计呢?上次在《测试的底层逻辑》中讲到了【输入输出测试模型】,还讲到了【2W1H测试分析法】,但2W1H分析法是初步的分析方…

Sharding-JDBC分库分表

Sharding-JDBC分库分表 一 分库分表概述 ​ 分库分表,就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成,将数据大表拆分为若干数据表组成,使得单一数据库,单一数据表的…

深度学习在语音识别方面的应用

前言 语音识别是一项非常重要的技术,它可以将人类的语音转化为计算机可以理解的形式。深度学习是一种非常强大的机器学习技术,它在语音识别方面也有广泛的应用。本文将详细介绍深度学习在语音识别方面的应用。 语音识别的基本步骤 语音识别的基本步骤包…

KDZD5550系列电压击穿试验仪系统组成

一、产品概述 KDZD5550系列电压击穿试验仪根据国家GB1408.1-2006《绝缘材料电气强度试验方法》其作用可称为电气绝缘强度试验仪、介质强度测试仪等。其工作原理是:把一个高于正常工作的电压加在被测设备的绝缘体上,持续一段规定的时间,加在上…

《软技能:代码以外的生存指南》阅读总结

文章收录: 个人网址:http://linglan01.cn/Github仓库:https://github.com/CatsAndMice/blog/issues 推荐一篇蛮有营养的文章速读《软技能 代码之外的生存指南》。 我比较喜欢实体书籍,所以自己干脆买一本《软技能:代码…

2023年5月DAMA-CDGA/CDGP数据治理认证考试报名

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…