什么是“静态共享库”

news/2025/4/3 1:40:09/文章来源:https://www.cnblogs.com/qscfyuk/p/18804742

  一般,共享目标文件在创建时,其基本虚拟地址是 0。

       我们用“readelf -l”查看一个so文件的程序头表,可以查看权限(Flags)为类型为可加载(LOAD)且权限为可读可执行(R E)的段需要映射到进程虚拟地址空间中的位置(VirtAddr)是不是0。

[root@localhost 1]# readelf  -l libtest1.soElf file type is DYN (Shared object file)
Entry point 0x4f0
There are 6 program headers, starting at offset 64Program Headers:Type           Offset             VirtAddr           PhysAddrFileSiz            MemSiz              Flags  AlignLOAD           0x0000000000000000 0x0000000000000000 0x00000000000000000x00000000000006ec 0x00000000000006ec  R E    200000LOAD           0x00000000000006f0 0x00000000002006f0 0x00000000002006f00x00000000000001f8 0x0000000000000208  RW     200000………………………………….

如果这个段需要映射到进程虚拟地址空间中的位置(VirtAddr)是0,则说明这个共享库加载到内存之后的位置是不固定的,这种共享库我们称之为“动态共享库”(Dynamic Shared Library),也就是我们常说的“动态库”。

如果这个段需要映射到进程虚拟地址空间中的位置(VirtAddr)不是0,而是一个确定的地址,这种共享库我们称之为“静态共享库”(Static Shared Library)。注意,与“静态库”有很明显的区别,从名字上就可以看出,多了“共享”。

静态共享库(Static Shared Library)有一个先天的缺陷:管理起来及其困难。你想啊,我编了一个静态共享库A,用了0x1000到0x2000的地址,别人的静态共享库如果也用了0x1000到0x2000的地址,那我俩的共享库就不能同时被加载。而且,假如我还写了另一个静态共享库B,用了0x2000到0x3000的地址,然后我发现我之前写的静态共享库A有问题,需要改一下,改完之后被改大了,要用到0x1000到0x3000的地址了。天啦噜,B的地址也要被往后改了!!!

“静态共享库”这种机制在现在看来真是让人无法理解,但是想到它是在“静态库”之后、动态共享库之前被设计出来的,放在它们俩中间的位置来看,我们就可以理解了:“静态共享库”解决了“静态库”一万个人要用printf就必须一万个人都自己加载一遍printf的定义那种丧心病狂的内存浪费。

可以这样想:“静态共享库”是对“静态库”的改进,解决了其对内存空间浪费的情况;“动态共享库”是对“静态共享库”的改进,解决了其可能造成地址冲突的情况。

其实现在还有一些“静态共享库”在被使用(因为不需要重定位,所以运行起来很快。目前有一些linux系统自己用的库是静态共享库,这些库一般都很成熟,不会有大的改动),比如Linux的“/lib64/libc.so.6”就是一个“静态共享库”,如果你用“readelf -l”看它的程序头表,可以发现这个so是被加载到了它指定的位置的。

[root@localhost 1]# readelf  -l /lib64/libc.so.6
Elf file type is DYN (Shared object file)
Entry point 0x383681ee30
There are 10 program headers, starting at offset 64Program Headers:Type           Offset             VirtAddr           PhysAddrFileSiz            MemSiz              Flags  AlignPHDR           0x0000000000000040 0x0000003836800040 0x00000038368000400x0000000000000230 0x0000000000000230  R E    8INTERP         0x000000000015a910 0x000000383695a910 0x000000383695a9100x000000000000001c 0x000000000000001c  R      10[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]LOAD           0x0000000000000000 0x0000003836800000 0x00000038368000000x0000000000189e5c 0x0000000000189e5c  R E    200000LOAD           0x000000000018a708 0x0000003836b8a708 0x0000003836b8a7080x0000000000004f50 0x0000000000009220  RW     200000…………………………………

可以看到,“/lib64/libc.so.6”会被装载到“0x3836400000”开始的地址。

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

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

相关文章

[T.2] 团队项目:选题和需求分析

Study The Spire :卡牌肉鸽关于这款游戏​ Study The Spire 是一款富有创意的 Rougelike 卡牌游戏,将随机与卡牌构筑要素融入游戏,选择不同卡牌来构筑独特卡组来战胜敌人,精心规划你的路线,获得丰富的游戏体验,在游戏过程中你也会逐渐提升自己的专业领域知识,休闲的同时…

高性能计算-GPU并行扫描

1. 扫描概念对数组arr[N]扫描就是得到数组prefix[N],每个元素是之前arr元素的求和. 开扫描定义:prefix1[N] = { arr[0], arr[0]+arr[1], ..., arr[0]+arr[1]+arr[N-1] } 闭扫描定义: prefix2[N] = { 0, arr[0], arr[0]+arr[1], ..., arr[0]+arr[1]+arr[N-12}2. Hillis steele …

硬盘损坏盘片划伤还能恢复数据资料吗?专业数据恢复公司怎么修复

这是一块台式机电脑里的希捷4T机械硬盘,型号是ST4000DM004,是北京某单位客户寄过来的,描述说是突然损坏不识别,出现了吱吱的异响声,先在北京当地找了一家数据恢复公司做了开盘维修处理,说是盘片有损伤,难度很大,在客户前后多次支付备件服务费后,也仅仅做出了100G左右的…

B+树是如何进行查询的?

千里之行,始于足下。 —— 老子因为一个数据页中的记录是有限的,且主键值是有序的,所以通过对所有记录进行分组,然后将组号(槽号)存储到页目录,使其起到索引作用,通过二分查找的方法快速检索到记录在哪个分组,来降低检索的时间复杂度。 但是,当我们需要存储大量的记录…

使用RAGFlow和Docker部署本地知识库

随着DeepSeek的火热,大模型对与广大开发者越来越触手可及。本文介绍了使用 DeepSeek R1 模型来构建本地知识库。Ollama 管理本地模型首先要了解大模型的管理工具 Ollama:安装 OllamaOllama 官网   点击下载安装 Ollama 客户端;安装成功后打开,在终端中输入以下命令来检查是…

CherryStudio使用

一、概述 CherryStudio 是一款集多模型对话、知识库管理、AI 绘画、翻译等功能于一体的全能 AI 助手平台。 CherryStudio 高度自定义的设计、强大的扩展能力和友好的用户体验,使其成为专业用户和 AI 爱好者的理想选择。无论是零基础用户还是开发者,都能在 CherryStudio 中找到…

app测试——adb基本命令

ADB常用的指令:查看当前连接设备 : adb devices进入到shell : adb shell查看日志 : adb logcat ctrl+c退出安装apk文件 : adb install xxx.apk 安装安卓版本后缀apkk包测试包路径:E:\dcs\two\app\baiduyuedu_5520.apk卸载APP : adb uninstall +包名案例:adb uninstall…

移动端动态化建设的演进与实践:从技术革新到生态繁荣

移动端动态化建设已从技术优化演变为企业战略的核心组成部分。尤其在业务迭代加速、生态竞争加剧的背景下,小程序容器技术以其高效、灵活、合规的特性,成为动态化演进的重要方向。未来,随着5G、AI等技术的普及,动态化将进一步推动应用开发范式的变革,为智能终端生态的繁荣…

快节奏业务增长,还是得App混合开发

在用户需求瞬息万变、全球化竞争加剧的背景下,混合开发已从“成本妥协方案”进化为“战略效率工具”。通过跨端框架与小程序的生态协同,企业不仅能实现业务的快速迭代与全球扩张,更能在技术降本与用户体验间找到最佳平衡点。正如某金融科技公司CEO所言:“混合开发不是选择题…

Actor移动

移动玩家需要先修改控制器,再把控制器的数据给到组件旋转非玩家:set actor world rotation 面朝玩家:find look at rotation + rinterp to玩家:首先修改控制器 get control rotation -> set world rotation移动玩家起手式:获取玩家控制器 add input vector向前:get co…

操作系统纷纷闭源,技术创新如何“弯道超车”?

在操作系统闭源化与多平台流量分散的双重挑战下,小程序容器技术凭借其轻量化、跨平台和容器化技术优势,成为企业降本增效的核心解决方案。未来,随着AI技术的深度赋能与行业协作的加强,小程序有望进一步打破系统边界,推动全球应用生态向开放、智能、高效的方向演进。近年来…

GSoC谷歌编程之夏2025招募中,Apache DolphinScheduler需要你的提案!

GSoC谷歌编程之夏活动火热进行中!今年,Apache DolphinScheduler项目也依然参与其中,设立了有趣且有挑战性的项目任务,与通用OIDC认证有关。欢迎有才华的你们来挑战! GSoC的起源与目的 GSoC 即 Google Summer of Code(谷歌编程之夏),是谷歌公司发起的一项全球性活动,旨…