认识 lib 目录里的 .so 文件


声明:本文转载自https://my.oschina.net/tridays/blog/2223075,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

当我们安装了共享库并运行了 ldconfig 之后,通常我们会在 lib/ 里看到三个 .so 文件。这里的 so 是 shared object 之意。

libfoo.so.1.0.0 这是普通的(regular)共享库文件。可能有多个版本的该文件并存。

libfoo.so -> libfoo.so.1.0.0 这个符号链接一般用在程序的链接过程(link)。你向 linker 指定的参数 -lfoo 便是在寻找并链接 libfoo.so 这个文件。通常情况下这总是个指向具体动态库的符号链接,因为有可能你需要在不同版本的库间切换。

libfoo.so.1 -> libfoo.so.1.0.0 这个符号链接一般用在程序的运行时。每个 .so 都会有一个 SONAME。应用程序根据 SONAME 来寻找并加载共享库。libfoo.so.1 就是一个 SONAME。你可以通过 objdump -p libfoo.so.1.0.0readelf -d libfoo.so.1.0.0 查看它。对于共享库的编写者来说,SONAME 相同的库应互相兼容。

有些包管理器(如 debian)会使用不同的包名来表示不同版本的共享库,因此你可以独立地安装、卸载、使用特定的共享库版本。

ldconfig 可以根据 libfoo.so.1.0.0 这样的共享库文件生成相应的符号链接文件。

你可能会遇到下述情况,这会导致崩溃:

  • app 使用了共享库 liba.so.2libb.so.1
  • libb.so.1 使用了共享库 liba.so.1

可以看到,程序同时加载了不同版本的 liba.so

拓展阅读

本文发表于2018年10月06日 08:00
(c)注:本文转载自https://my.oschina.net/tridays/blog/2223075,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2181 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1