认识 lib 目录里的 .so 文件
当我们安装了共享库并运行了 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.0
或 readelf -d libfoo.so.1.0.0
查看它。对于共享库的编写者来说,SONAME 相同的库应互相兼容。
有些包管理器(如 debian)会使用不同的包名来表示不同版本的共享库,因此你可以独立地安装、卸载、使用特定的共享库版本。
ldconfig
可以根据 libfoo.so.1.0.0
这样的共享库文件生成相应的符号链接文件。
你可能会遇到下述情况,这会导致崩溃:
- app 使用了共享库
liba.so.2
和libb.so.1
libb.so.1
使用了共享库liba.so.1
可以看到,程序同时加载了不同版本的 liba.so
。
拓展阅读
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Akka向设备组添加Actor注册《thirteen》译
我们已经完成了设备级别的注册支持,现在我们必须在组级别实现它。在注册时,小组成员还有更多工作要做,包括: 通过将注册请求转发给现有设备actor或通过创建新actor并转发消息来处理注册请求。 跟踪组中存在哪些设备Actor,并在组停止时从组中删除它们。 处理注册请求 设备组Actor必须将请求转发给现有子项,或者应创建一个。要通过设备ID查找子actor,我们将使用Map <String,ActorRef>。 我们还希望保留请求的原始发件人的ID,以便我们的设备角色可以直接回复。这可以通过使用forward而不是tell运算符来实现。两者之间的唯一区别是,forward会保留原始发件人,而tell会将发件人设置为当前的actor。就像我们的设备actor一样,我们确保不会响应错误的组ID。将以下内容添加到源文件中: Full source at GitHub 正如我们对设备所做的那样,我们测试了这个新功能。我们还测试了返回两个不同ID的Actor实际上是不同的,我们还尝试记录每个设备的温度读数,以查看Actor是否正在响应。 Full source at GitHub 如...
- 下一篇
Java 函数式编程和 lambda 表达式
Java 函数式编程和 lambda 表达式 为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论。函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做。说白了,函数式编程是基于某种语法或调用API去进行编程。例如,我们现在需要从一组数字中,找出最小的那个数字,若使用用命令式编程实现这个需求的话,那么所编写的代码如下: publicstaticvoidmain(String[]args){ int[]nums=newint[]{1,2,3,4,5,6,7,8}; intmin=Integer.MAX_VALUE; for(intnum:nums){ if(num<min){ min=num; } } System.out.println(min); } 而使用函数式编程进行实现的话,所编写的代码如下: publicstaticvoidmain(String[]args){ int[]nums=newint[]{1,2,3,4,5,6,7,8}; intmin=IntStream...
相关文章
文章评论
共有0条评论来说两句吧...