问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux动态库问题

发布网友 发布时间:2022-04-23 00:50

我来回答

3个回答

热心网友 时间:2023-07-07 03:37

1、虽然动态库有点浪费内存,但是动态库最大的作用是:减少占用磁盘空间,减少开发时的编译时间,而不是你想的编译速度慢。因为采用了动态库,所以如果我修改了动态库,我只需要编译动态库。而如果采用了静态库,如果修改了静态库,那么,所有用了该静态库的程序和静态库都必须重新编译。而且gcc不是扫描整个libc.so文件。因为so文件里有符号表,哪个符号在哪个.o文件里,只要扫描符号表就知道了,而且由于他不需要从so文件中拷贝使用的函数,从某种意义上来说编译速度比静态库更快。
2、动态库的加载采用写时拷贝技术,即:只有当我用这个函数的时候我才把该函数部分拷贝过来,它不会拷贝整个so文件,只会拷贝需要的部分。

热心网友 时间:2023-07-07 03:37

但是动态库中却包含了大量的函数,假设我只使用了printf函数,但是却加载了整个libc.so.这样不是内存的浪费吗。
libc中的函数都是常用的.而且动态库是所有进程共享的.即使整个库都加载了,你的进程用不到,其他进程还会用到的.

如果某个你自己的动态库只有你自己的进程用,那么我相信你就不会再库中编译很多你用不到的函数来浪费内存了.

一个动态库文件不仅包含真正需要拷贝到内存中的机器码,还包含一些其他的信息.比如函数索引.
另外gcc编译的时候只会扫描库的索引,而不是去扫描整个库文件.

热心网友 时间:2023-07-07 03:38

动态库的作用:
节省磁盘和内存空间,还可以减少物理内存页面的换入换出,也可以增加CPU缓存的命中率;
程序的升级变得更加容易;
便于不同的开发者和开发组织之间独立进行开发和测试;

至于你的疑问:
1. 只使用printf函数,系统只会加载libc.so的printf所在的页;所以操作系统管理内存是按照页来管理的,操作系统为进程建立内存和虚拟空间的映射,以及虚拟地址空间和磁盘文件(可执行程序)的映射,并且操作系统提供了写时拷贝技术;也就是只有真正运行了printf函数时,操作系统才将libc.so中的printf函数所在的页加载到内存(通过以上两个映射来做)
所以不存在你的内存浪费的问题;

2. 使用printf函数,在编译时,这里需要扫面整个libc.so,静态库也一样;
链接时,可执行程序只保存了printf符号(PIC,地址无关代码),和libc.so库名称;
运行时,动态加载器需要遍历可执行程序所使用的所有地址无关代码,并且记载所有的so库(加载到进程虚拟地址空间,实际上还没有加载到内存),将printf与实际的so库虚拟地址关联;
这里当程序运行printf时,需要进行间接地址访问到so库的地址,所以效率上比静态库低(静态库是直接地址访问)
并且,由于动态库需要动态加载器的加载过程,而静态库不需要,所以运行效率没有静态库方式高;

希望以上的解答可以给你帮助。另外,如果你还有其他疑惑,你可以去看下《程序员的自我修养》这本书,里面讲的比较详细。

如果你有其他疑问,尽快在这里问,我懂的话,都可以给你解答

参考资料:《程序员的自我修养》

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 为什么现在的Linux系统安装动不动就是几个G 如何让linux的服务自动启动 linux在启动的时候,需要执行什么动作? linux动态库的创建 临沂市哪里有布匹批发市场 Linux系统动鼠标黑屏原因 那里是生产布匹的集中地 linux重启动速度很慢 笔记本鼠标不动了怎么办按什么键处理? 济南的布匹批发市场在什么地方? 红旗E-HS9实车图 先睹为快 中山市的布料市场在哪里呀?坐公车怎么去? 红旗HS5到店实拍,18.38万起,配LED光源+ LCD仪表,搭载2.0T动力 红旗H9开始走红!光车长就5137mm,最低也要30.98万 苏州哪里有批发各种布料江苏苏州最大的布匹批发市场在哪里? 车展报道:红旗E-HS9实拍!高端纯电SUV市场又来搅局者? 中国有哪些布匹批发市场? 红旗E-HS9实车亮相,豪起来不输揽胜,这才是国产品牌该有的排面 山东最大的布匹市场在哪? 红旗新车帅得可怕!2021上海车展“七宗最”! 宏基笔记本鼠标经常不动怎么办? Linux动态模块怎样编译? linux动静分离什么意思 linux 下怎么从光盘重启动 linux下如何显示动态的gif图片??? 怎样使linux基础命令讲解的生动有趣 linux 什么时候使用 动态链接 安装Linux 出问题了,卡这不动了。。。急等 Prefix是什么意思? prefix有哪些 什么是prefix 怎么把手机里的歌曲存到电脑里? 什么叫前缀? 手机里本地音乐怎样才能上传到电脑里? 英语词性缩写中的prefix是何? prefix是什么词性 ize后缀动词,pre前缀、中缀的英语单词分别是什么? linux, configure --prefix=/有什么用 prefix作为前缀的单词 有哪些? 怎么把手机上的歌传到电脑上?