linux 动态库(so).docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux 动态库(so)

动态库(.so) 此页由Linux Wiki用户Chenxing于2011年3月27日 (星期日) 07:11的最后更改。 出自Linux Wiki Linux中的.so文件类似于Windows中的DLL,是动态链接库,也有人译作共享库(因so的全称为Shared Object)。当多个程序使用同一个动态链接库时,既能节约可执行文件的大小,也能减少运行时的内存占用。[1] 对于用户而言,经常遇到的问题是某些应用程序找不到其需要的.so文件: error while loading shared libraries: ...: cannot open shared object file: No such file or directory 本文将主要围绕该问题展开,介绍so文件存放位置、版本命名方案等。欢迎补充其它信息。 目录 [隐藏]  1 存放位置  2 程序链接的动态库  3 版本  4 参考资料 存放位置 Linux中绝大多数.so文件都存放在/lib、/usr/lib/(见Linux目录结构),对于64位和32位共存的系统,32位的动态库可能会放在/lib32、/usr/lib32,完整的动态库存放路径列表可通过/etc/ld.so.conf文件配置。(如果修改了配置,需要用 /sbin/ldconfig 命令更新缓存) 应注意动态库搜寻路径并不包括当前文件夹,所以当即使可执行文件和其所需的so文件在同一文件夹,也会出现找不到so的问题,如 ./chrome: error while loading shared libraries: libnss3.so.1d: cannot open shared object file: No such file or directory 此时可用LD_LIBRARY_PATH环境变量做临时设置,如: LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./chrome 也有些so文件是在程序执行时临时加载的(如插件),它们的路径就比较灵活,只要可执行文件能找到它就行了。 程序链接的动态库 一个可执行文件链接了哪些动态库呢?在遇到“error while loading shared libraries”时,我们难免会对此产生好奇。 查看该信息的方法是通过ldd,如 $ ldd chrome linux-vdso.so.1 = (0x00007fff52dff000) libX11.so.6 = /usr/lib/libX11.so.6 (0x00007f0caebe4000) libdl.so.2 = /lib/libdl.so.2 (0x00007f0cae9e0000) libXrender.so.1 = /usr/lib/libXrender.so.1 (0x00007f0cae7d6000) libXss.so.1 = /usr/lib/libXss.so.1 (0x00007f0cae5d3000) libXext.so.6 = /usr/lib/libXext.so.6 (0x00007f0cae3c1000) librt.so.1 = /lib/librt.so.1 (0x00007f0cae1b9000) ....(略) 要想看系统还没找到的动态库,可以借用grep: $ldd chrome | grep not found libnss3.so.1d = not found libnssutil3.so.1d = not found libsmime3.so.1d = not found libplc4.so.0d = not found libnspr4.so.0d = not found 版本 动态库的版本总是个问题,如果编译时链接的库和执行时提供的不一样,难免会导致程序的执行发生诡异的错误。为解决此问题,Linux系列的做法是这样的: 首先,每个so文件有一个文件名,如libABC.so.x.y.z,这里ABC是库名称,x.y.z是文件的版本号,一般来说:[2]  第一位x表示了兼容性,x不一样的so文件是不能兼容的。  第二位y的变化表示可能引入了新的特性(Feature),但总的来讲还是兼容的。  第三位z的变化一般表示仅是修正了Bug。  并非所有.so文件都遵循此规则,但其应用确实很普遍。 在系统中,会存在一些符号链接, 如[3]: libpam.so - libpam.so.0.83.0 libpam.so.0 - libpam.so.0.83.0 其中第一个主要在使用该库开发其它程序时使用,比如

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档