【Linux】动静态库

目录

站在库提供者的角度

静态库

制作静态库

静态库的内容

发布静态库

用户使用静态库

找头文件

找库文件

动态库

制作动态库

动态库报错 

动态库是怎么被加载的?

地址相关问题

程序加载前的地址

程序加载后的地址

如何执行第一条指令?

动态库的地址


站在库提供者的角度

有两种方法


静态库

制作静态库

ar是一个生成静态库的命令,目的是把所有.o文件打包成一个.a文件。

rc是表示在.a文件中创建或替换.o文件。


静态库的内容

把源文件变成.o文件然后打包成一个库,这就是静态库。


发布静态库

当别人需要使用我们的静态库时,只用把lib给他就行了。


用户使用静态库

找头文件

gcc编译时,会去系统默认头文件目录和当前目录找对应头文件,加一个I后面跟指定目录就是告诉系统顺便去这里找一下头文件。

找库文件

gcc编译时,会去系统默认库路径下找库文件,加L后面跟路径就是告诉系统来这个路径找库文件,加l后面直接跟库的名字就是告诉系统我要链接这个库。

总结:第一步找头文件,第二步找库文件,第三步指定哪个库。

如果不想这么麻烦,我们可以把头文件和库文件放到系统默认路径中,或者在系统默认路径建立软链接。

放到默认路径相当于安装。

在系统默认路径下添加一个软链接。


动态库

在链接之前,动静态库都一样,都需要把源文件变成.o文件。

制作动态库

先准备一些源文件和头文件。

一次生成两个库。

生成静态库。

生成动态库。

把源文件编译成.o文件时要加fPIC,把.o文件打包成库时要加shared。

清理和发布,生成一个目录进行存放。

发布形成自己的库。

这个库给别人使用。

main.c要包头文件。

使用静态库。

使用动态库。

同时依赖多个库。


 

动态库报错 

关于动态库的报错。

已经告诉了你在哪里,为什么会找不到?

原因在于你告诉的是编译器,编译完后变成可执行程序就和编译器没关系了。

这里报的是加载错误,就是你还得告诉系统,告诉加载器,不仅编译要有路径,加载也要有路径。

一个有四种做法,

第一:直接把库拷贝(安装)到系统路径中。

第二:在系统路径建立软链接。

第三:添加环境变量,这个环境变量是用来搜索用户自定义库的路径。 

把动态库所在的路径添加到环境变量中。

第四:设置配置文件。

进入这个目录,这里面存放的都是配置文件。

创建一个配置文件,把动态库的路径写进去。

重新加载配置文件。

环境变量是临时的,配置文件是永久的。


动态库是怎么被加载的?

动态库也是文件,先从磁盘加载到物理内存中,进程的页表会把动态库的位置和自己的共享区建立映射。

当进程要用到动态库时,会判断是否已经加载,如果已经加载了,那么页表直接映射到自己的共享区即可。

库里面的全局数据会不会因为多进程而受到影响?

不会,会发生写时拷贝。


地址相关问题

程序加载前的地址

程序编译之后,内部就具备地址。

平坦模式:程序内部的地址编排和虚拟地址基本一致。(编译器要考虑操作系统)

当程序在磁盘中还未加载时就已经具备了地址,这个地址叫逻辑地址,相当于虚拟地址,也就是在磁盘中还未加载时就已经照顾到虚拟地址了。


objdump -S 将程序反汇编。

程序加载后的地址

程序加载到物理内存后也会自动有对应的物理地址。

如何执行第一条指令?

进程会记录自己在哪个工作目录下,进程也能找到自己的可执行程序。

第一步,读取可执行程序,CPU的pc寄存器会获取对应的入口地址。这个入口地址是程序加载前就有的,是逻辑地址所以相当于虚拟地址。

第二步,用虚拟地址去页表找物理地址,但此时并没有建立映射,此时会触发缺页中断,然后加载程序,建立映射。

第三步,系统知道指令的长度,每读完一条指令,PC存的地址就往后加,就这样不断向后执行。

如果读到call指令,CPU会发现这是函数调用,CPU读到的指令内部可能有地址,这个地址是逻辑地址,也就是虚拟地址,所以就直接用虚拟地址去找物理地址。物理地址不存在就缺页中断加载程序默认就有对应的物理地址了,然后建立映射。


动态库的地址

程序用到库函数,触发缺页中断库会加载,库的虚拟地址和物理地址建立映射,虚拟地址在共享区。

库的地址不能是固定的,只能是任意位置加载。

库内部函数的地址是偏移量。

加载库的地址是库的起始地址,当用到库函数时就用起始地址加偏移量找到对应虚拟地址然后找到映射。

保证库可以在虚拟内存任意位置加载。


 

因为静态库会直接拷贝到可执行程序里。静态库编译的时候就是按虚拟地址编的,位置是确定的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

500字理透react的hook闭包问题

在react中hook的闭包问题很容易在不经意间犯错,项目写大了之后更是难以找到到底是哪里出了问题。 为什么会出现闭包问题 出现闭包问题的原因就是函数中操作的变量不是最新的变量,什么意思呢,我们知道函数组件每次刷新都是重新运行一次函数&…

Unity Shader Graph 2D - 一个简单的魔法阵激活效果

前言 在魔幻类游戏里通常会有魔法阵的存在,而当某个机关被触发或者某个剧情被触发时,需要对魔法阵进行激活,这个时候就需要一个魔法阵的激活效果来让这个游戏的这一时刻的交互性更强,生动性更强,本文将用一种十分简单的方式来实现一个魔法阵的激活效果。 创建一个…

C++ 类和对象(友元、内部类、匿名对像)

目录 一、前言 二、正文 1.友元 1.1友元函数的使用 1.1.1外部友元函数可访问类的私有成员,友员函数仅仅是一种声明,他不是类的成员函数。 1.1.2一个函数可以是多个类的友元函数 2.友元类的使用 2.1什么是友元类 2.2 友元类的关系是单向的&#x…

Docker Network

1.简介 容器之间的通讯时通过网桥通讯的,跨主机通讯可以使用flannel进行通讯 那么为什么主机可以访问到虚拟机内部呢?因为VMware虚拟出一个虚拟的网卡,而这个虚拟网卡和主机在同一个局域网下 NAT是映射一个虚拟网卡,进行路由通信…

【Linux系统】—— 冯诺依曼体系结构与操作系统初理解

【Linux系统】—— 冯诺依曼体系结构与操作系统初理解 1 冯诺依曼体系结构1.1 基本概念理解1.2 CPU只和内存打交道1.3 为什么冯诺依曼是这种结构1.4 理解数据流动 2 操作系统2.1 什么是操作系统2.2 设计OS的目的2.3 操作系统小知识点2.4 如何理解"管理"2.5 系统调用和…

【行业解决方案篇十八】【DeepSeek航空航天:故障诊断专家系统 】

引言:为什么说这是“航天故障终结者”? 2025年春节刚过,航天宏图突然官宣"DeepSeek已在天权智能体上线",这个搭载在卫星和空间站上的神秘系统,号称能提前48小时预判99.97%的航天器故障。这不禁让人想起年初NASA禁用DeepSeek引发的轩然大波,更让人好奇:这套系…

计算机网络真题练习(高软29)

系列文章目录 计算机网络阶段练习 文章目录 系列文章目录前言一、真题练习总结 前言 计算机网络的阶段练习题,带解析答案。 一、真题练习 总结 就是高软笔记,大佬请略过!

从猜想终结到算法革新,弹性哈希开启数据存储新篇章

目录 哈希表的前世今生基本原理从传统到现代:哈希表的演变历程安德鲁 克拉皮文及其团队的创作历程弹性哈希详解基本原理优点技术细节漏斗哈希解析基本原理优点技术细节新算法的实际应用案例电子商务推荐系统金融交易监控系统社交媒体内容过滤物联网设备管理结论与展望哈希表的…

DeepSeek各模型现有版本对比分析

文章目录 一、基础模型系列:V1 到 V3 的演进二、专用模型系列:推理与多模态三、版本选型与商业化趋势 DeepSeek作为最近特别火爆的模型,本文将对DeepSeek现有的主要版本进行对比分析,涵盖参数规模、训练数据、功能改进、应用场景和性能表现等…

RabbitMQ学习—day6—springboot整合

目录 1. springboot配置 2. 开始写RabbitMq代码 3. 队列优化 4. 插件实现延迟队列 5. 总结 前一小节我们介绍了死信队列,刚刚又介绍了 TTL,至此利用 RabbitMQ 实现延时队列的两大要素已经集齐,接下来只需要将它们进行融合,再加…

Automa 浏览器自动化编排 实现自动化浏览器操作

在日常的浏览器使用过程中,我们常常会遇到一些重复繁琐的任务,比如反复填写网页表单、从网页抓取数据、定时截图等,这些工作不仅耗费时间和精力,还容易出错。今天要给大家介绍的Automa,就是一款专门用来解决这类问题的…

【多模态处理篇五】【DeepSeek文档解析:PDF/Word智能处理引擎】

你知道吗?全球每天产生的PDF文档超过10亿份,但90%的上班族还在用复制粘贴的笨办法处理文档!DeepSeek文档解析引擎就像给你的电脑装上了"文档翻译官",能把PDF/Word里的文字、表格、公式甚至排版样式都变成AI能理解的"语言"。举个真实场景:法务小姐姐用…

【C语言】结构体内存对齐问题

1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的?内存是如何分配的?所以我们得知道如何计算结构体的大小?这就引出了我们今天所要探讨的内容:结构体内存对齐。 1.1 对齐规…

【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】

最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…

IDEA使用Maven方式构建SpringBoot项目

1、环境准备 确保你已经安装了以下工具: Java JDK(推荐 JDK 8 或更高版本) IntelliJ IDEA(推荐使用最新版本) 2、创建 Spring Boot 项目 (1) 打开 IntelliJ IDEA。 (2&#xff09…

【Redis原理】底层数据结构 五种数据类型

文章目录 动态字符串SDS(simple dynamic string )SDS结构定义SDS动态扩容 IntSetIntSet 结构定义IntSet的升级 DictDict结构定义Dict的扩容Dict的收缩Dict 的rehash ZipListZipListEntryencoding 编码字符串整数 ZipList的连锁更新问题 QuickListQuickList源码 SkipListRedisOb…

Git Repo下如何制作一个patch文件

Git Repo下如何制作一个patch文件 1. 源由2. 步骤2.1 本地代码差异2.2 添加修改代码2.3 添加未跟踪代码2.4 确认打包文件2.5 输出打包文件2.6 自查打包文件2.7 恢复工作环境 3. 总结 1. 源由 patch分享,更好的差异化比较,减少时间浪费。同时&#xff0c…

跟着李沐老师学习深度学习(十四)

注意力机制(Attention) 引入 心理学角度 动物需要在复杂环境下有效关注值得注意的点心理学框架:人类根据随意线索和不随意线索选择注意力 注意力机制 之前所涉及到的卷积、全连接、池化层都只考虑不随意线索而注意力机制则显示的考虑随意…

STM32的“Unique device ID“能否修改?

STM32F1系列的"Unique device ID"寄存器的地址为0x1FFFF7E8。 这个寄存器是只读的。 "Unique device ID"寄存器位于“System memory”中。“System memory”地址范围为“0x1FFF F000- 0x1FFF F7FF”。 所有STM32 MCU上都存在系统引导加载程序。顾名思义&a…

模型思维 - 领域模型的应用与解析

文章目录 引言模型的核心作用与价值四大模型类型UML建模工具UML类图的核心价值类关系深度剖析企业级建模实践 领域模型(推荐) vs 数据模型(不推荐)区别联系错把领域模型当数据模型错误方案 vs 正确方案对比正确方案的实现1. 数据库…