深入理解计算机系统_静态链接和动态链接以及静态库和动态库

news2024/9/24 11:21:50

这篇文章记录静态链接和动态链接以及静态库和动态库的原理。

1 静态链接和动态链接

链接其实就是连接的意思,将所有相关的东西连接起来。

1.1 静态链接

什么是静态链接?编译时候的链接就是静态链接,所以ld/collect2链接程序,也称为静态链接器。在编译时候,调用gcc自动调用ld/collect2链接程序,将所有的.o文件整合在一起,然后保存在可执行文件中。
静态链接做了两件事情,分别是符号解析和重定位。

1.1.1 符号解析

符号解析的目的就是将每个X.c生成的目标文件X.o中的引用和符号的定义联系起来。
在这里插入图片描述

1.1.2 重定位

重定位做的事情:将.o文件中每个机器指令的逻辑地址,重定位为实际运行的地址(虚拟内存地址)。如果是裸机运行的:运行的地址就是内存的物理地址;如果是基于OS运行的:运行地址就是虚拟内存的地址。不过虚拟内存机制,最终还是会将虚拟地址会转为物理地址。
在这里插入图片描述
上图中,每个段开始都是逻辑地址,从0开始的一个编号,这个编号只是一个编号,既不是虚拟内存地址也不是物理地址,就是一个标识。
通过collect2链接后,就可以将这些段的编号重定位成虚拟内存地址,如下图所示:
在这里插入图片描述

1.2 动态链接

动态链接,就是在编译时候只留下调用接口(函数所在库的相对地址),当程序真正运行时候,才去链接执行。动态链接不是在编译时发生的,而是在程序动态运行时发生的,所以叫称为动态链接。比如,printf,这个函数就是动态库提供的,程序编译后在调用printf处,只留下动态库的printf接口,程序运行起来后再去调用Printf函数。
下面说一下,什么是静态库和动态库?

2 静态库和动态库

这两个文件都是由许多.o文件打包成的文件,相当于一个文件仓库。

2.1 静态库

链接静态库时,就是将库中.o的代码包含到自己的程序中,每个程序链接静态库后,都会包含一份独立的代码,当这些程序都运行起来时,所有这些重复的代码都需要占独立的存储空间,显然很浪费计算机资源。

2.2 动态库

动态库就是为了解决静态库的缺点。
在链接动态库时,collect2/ld不会将动态库中.o的代码直接静态链接(复制)到自己程序中,只会留下调用接口。程序运行时再去将动态库(链接)加载到内存中,然后就能调用动态库的函数(代码)了。不管多少程序使用了这个动态库,这些程序只会共享使用同一份的动态库(只加载一份在内存中),因此动态库也被称为共享库。

动态库的实现原理

程序运行起来后,“动态链接器”一看想链接的是libc.so动态库,首先检查内存中有没有这个动态库。如果没有:到硬盘上找到libc.so库,将所有代码加载(动态链接)到内存中,并得到整个动态库在内存中的起始地址;如果有,说明之前已经加载过了,所以不再加载,直接得到动态库在内存中的起始地址即可。
我们调用动态库的printf时候,如何找到这个函数?
Printf编译后,程序中留下printf 在动态库中的相对地址。
在这里插入图片描述
Printf的绝对地址= printf的相对地址 + 动态库加载时候的地址
在这里插入图片描述
当动态链接器加载动态库之后,会得到动态库在内存中的起始地址,通过上边的计算公式,就得到了printf的真正地址。

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

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

相关文章

公司让我一个人干数据中台,是不是可以准备找下家了

大数据群里,有个哥们问了下面这样一个问题,让刚刚阳康返工的群友们笑的心跳加速,直接炸锅。 开工有惊喜 一个人搞一个数据中台!这是啥神仙领导做出来的决策?是发烧的时候拍脑袋定的吗?热心的群友也都给出了…

vector类的使用

目录 ​一、vector类的组织形式 二、vector类的成员函数 1.默认成员函数 (1)构造函数、拷贝构造函数 (2)析构函数和赋值运算符重载 2.容量操作 3.迭代器(iterator) 4.元素访问 5.修改操作 一、vec…

web3调研:Dusk Network调研

在此声明,仅做分享,绝不存在倡导炒币行为 原文链接:Dusk 调研报告 web3产品调研系列 1、web3调研:Iron fish调研 2、web3调研:Dusk Network调研 目录web3产品调研系列一、背景概述二、项目介绍2.1 创始团队2.2 项目融…

【数据结构】三万字图文讲解带你手撕八大排序(附源码)

👑作者主页:进击的安度因 🏠学习社区:进击的安度因(个人社区) 📖专栏链接:数据结构 文章目录一、前言二、排序的概念和运用三、八大排序讲解及实现1、直接插入排序1.1 排序思路1.2 代…

Java重点源码回顾——ConcurrentHashMap1.7

1. 概述 HashMap在我们的日常生活中使用很多,但是它不是线程安全的。我们可以使用HashTable来代替,主要实现方式是在方法中加入synchronized,所以效率也比较低。因此,对于键值对,我们可以尝试使用ConcurrentHashMap来…

《Java 后端面试经》微服务篇

《Java 后端面试经》专栏文章索引: 《Java 后端面试经》Java 基础篇 《Java 后端面试经》Java EE 篇 《Java 后端面试经》数据库篇 《Java 后端面试经》多线程与并发编程篇 《Java 后端面试经》JVM 篇 《Java 后端面试经》操作系统篇 《Java 后端面试经》Linux 篇 《…

关于Linux 网络抓包的一些笔记整理

写在前面 遇到一个 ping 单通 的情况,需要抓包分析下,所以整理这部分笔记博文内容涉及: HTTP/TCP 抓包分析 DemoICMP 抓包分析 DemoNginx 抓包分析用户名密码 Demo 理解不足小伙伴帮忙指正 这世界的存在完全只是就它对一个其他事物的&#xf…

【自学Java】Java选择结构if

Java选择结构if Java语言if条件判断 在 Java 中,关键字 if 是用于测试某个条件(布尔型或逻辑型)的语句是否满足一定的条件,如果满足特定的条件,则会执行 if 后面的大括号 {} 括起来的代码块,如果没有代码…

hnu社交网络分析作业2

前言:前言:上的是林剑新老师的课程,还是比较有意思的,此博客用来记录作业的学习情况,答案为老师提供的 一、2 跳标签索引是一种在网络中进行距离查询时广泛使用的技术。算法 1 描述了一种在无向图中构造 2 跳标签索引…

Java 接口介绍和使用

1.什么是接口? 接口就是给出一些没有实现的方法,封装到一起,当某一个类要使用的时候再实现出来。 2.接口的语法 interface name{ attributes methods } 比如如下USB接口 public interface Usb {public void start();public void s…

Vue 中 CSS scoped 的原理

前言 在日常的Vue项目开发过程中&#xff0c;为了让项目更好的维护一般都会使用模块化开发的方式进行。也就是每个组件维护独立的template&#xff0c;script&#xff0c;style。主要介绍一下使用<style scoped>为什么在页面渲染完后样式之间并不会造成污染。 示例 搭…

FreeRTOS开发指南

1&#xff1a;任务模板 //任务优先级 #define XXX_TASK_PRIO 1 //任务堆栈大小 #define XXX_STK_SIZE 128 //任务句柄 TaskHandle_t XXXTask_Handler NULL; /* * 放在开始任务&#xff0c;只需要执行一次为了创建任务 */ void Create_XXX_Task(void) {BaseType_t xR…

编码器-解码器架构

“编码器&#xff0d;解码器”架构可以将长度可变的序列作为输入和输出&#xff0c;因此适用于机器翻译等序列转换问题。 编码器将长度可变的序列作为输入&#xff0c;并将其转换为具有固定形状的编码状态。 解码器将具有固定形状的编码状态映射为长度可变的序列。 机器翻译是…

2022 年我国的对外贸易行业发展如何?

2021年&#xff0c;在各种不确定因素的影响下&#xff0c;中国外贸人依然以其强大的韧性和实力取得了新的进出口成绩。去年进出口总值创历史新高&#xff0c;达到6.05万亿美元&#xff0c;一年内分别突破5万亿美元和6万亿美元。 在2021年成绩和经验的加持下&#xff0c;今年外…

SpringBoot+VUE前后端分离项目学习笔记 - 【08 SpringBoot实现分页查询】

手动实现分页功能 先理解分页查询原理 采用limit语句来实现分页 -- 页码PageNum 每页数据条目PageSize5 -- 第一页 PageNum0, limit 0,5 SELECT * FROM sys_user limit 0,5; -- 第二页 PageNum1, limit 5,5 SELECT * FROM sys_user limit 5,5; -- 公式&#xff1a; limit …

Python压缩模块:bz2

文章目录基本原理调用基本原理 bz2和zlib的功能是基本一致的&#xff0c;只是算法不同。zlib模块此前已经总结了&#xff1a;zlib模块详解 bz2模块用到的压缩算法是bzip2算法&#xff0c;其核心是BW变换和MTF变换&#xff0c;当然最后少不了霍夫曼编码。 BWT&#xff0c;即B…

Qt RSA OpenSSL C++ Qt加密解密签字通信系统窗体源码

程序示例精选 Qt RSA OpenSSL C Qt加密解密签字通信系统窗体 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Qt RSA OpenSSL C Qt加密解密签字通信系统窗体>>编写代码&#xff0c…

年终回顾 | 小米技术最受欢迎的技术文章TOP20

转眼间&#xff0c;小米技术已经陪伴大家度过了一整个年头。在一年里&#xff0c;我们始终坚持为大家提供有趣好玩的技术科普、硬核前沿的技术干货&#xff0c;带给大家一切有关小米的新鲜技术创新内容。2023年就要到了&#xff0c;欢迎你点击文末左下角的“阅读原文”填写一份…

Vue3:搜索框输入防抖实现整理笔记

目录 场景需求 前言 防抖 & 节流 防抖 节流 输入防抖存在的问题 指令实现 总结 在Vue开发中&#xff0c;遇到了搜索框输入防抖处理&#xff0c;算是防抖的使用场景之一吧&#xff0c;抽象其逻辑记录下来以备后用 场景需求 作为开发人员&#xff0c;一定要先搞清楚…

Android---Material Design

目录 一、什么是Material Design Z轴 Material Design 的一些 theme 一、什么是Material Design Material Design 中文名&#xff1a;材料设计语言&#xff0c;是由 Google 推出的全新的设计语言。Google 表示&#xff0c;这种设计语言旨在为手机、平板、台式机和“其它平台”…