本文主要介绍在Linux操作系统中,同一个共享库(so)的几个名称,以及这几个名称的应用场景。

1 概述

本文从共享库(so)的版本控制角度来讲述。本文会以 curl 共享库 libcurl 为例,来展开讲述。

首先在此说明,so有三个名字,如下:

  • realname:so的真实名称,如 libcurl.so.4.5.0
  • soname:so的软链接名称,如 libcurl.so.4
  • linkername:编译过程中使用的so的名称,如 curl

2 realname

realname是so的真实名称,如编译安装curl软件后,生成的 /usr/local/lib/libcurl.so.4.5.0。

realname在文件名中带有版本号信息,如 libcurl.so.4.5.0 的“4.5.0”。

3 soname

从版本控制的脚本来看,如果一个可执行程序直接连接到so的realname,那么当该so升级的时候,so的版本号发生了变化,那么就必须重新编译生成该可执行程序,这显然是不好的版本管理方式。为了解决此问题,出现了so的soname。soname实际上是realname的一个软链接,我们可以通过“readelf -d”命令查看so的soname,如下:

soname一般会保留so的大版本号,如 libcurl.so.4。

在编译生成程序(可执行程序及共享库)时,我们通常都是连接的soname,这样当被依赖的so升级时,由于soname并没有变化,只需要将soname指向新的realname,即可实现被依赖的so的升级了,如此就实现了so的版本控制。

4 linkername

linkername是编译代码时的连接阶段使用的so的名字,实际上linkername也是指向realname的。

一般在程序编译时,我们会通过 -l 选项为其指定需要连接的so的名字(或是使用CMakeLists.txt时,为其指定的so的名字),样式类似:

-lcurl

或对应CMakeLists.txt中的“target_link_libraries(目标程序 ... curl ...)”,这里的 curl 就是so的linkername。

5 so的三个名称之间的关系

在编译生成程序时使用linkername进行连接的,而这个linkername实际上是指向 realname 的,但是在后续的使用过程中,程序其实是使用 soname 来找到被依赖的 realname 的,那么这三者是如何在编译、使用过程中连接起来的呢?

原来在编译生成 realname 时,已经为其指定了对应的 soname (如前文所述,可通过“readelf -d”来查询),这样以 soname 作为桥梁,即可将so的三个名称联系起来。

结合程序的编译、生成、运行过程,描述so的三个名称关系如下:

1. 程序编译时,用到了依赖库的so的 linkername,即 curl,由于 linkername 指向 realname,所以程序实际上连接到了 realname;

2. 程序从 realname 处获取到运行时需要用到的 soname,即 libcurl.so.4;

3. 编译生成程序;

4. 程序运行时,调用 soname,而 soname 实际上又指向了 realname,所以程序实际上是调用的 realname。

上述几个步骤可以使用下图来表述:

Linux中共享库(so)的几个名称及相关用法相关推荐

  1. Linux中静态库和动态库(共享库)的区别

    1. 静态库和动态库的制作过程区别 1.1 静态库的制作过程 详见博客:Linux中静态库的制作与使用 1.2 动态库的制作过程 详见博客:Linux中动态库(共享库)的制作与使用 2. 静态库和动态 ...

  2. Linux中动态库(共享库)的制作与使用

    0. 库的基本概念 见博客:Linux中静态库的制作与使用 0.1 动态库的工作原理 首先回忆一下静态库,使用静态库,在GCC进行链接时,会把静态库中代码打包到可执行程序中. 但是使用动态库,在GCC ...

  3. Unix网络编程unp.h问题以及Linux中的库

    Stevens的<UNIX网络编程 卷1:套接字连网API>是一本很著名的UNIX网络编程书籍.其中使用了一个unp.h的引用,如果没有设置相应的库的话,即使引入了头文件也是没用的.所以首 ...

  4. Linux中 C++ main函数参数argc和argv含义及用法

    Linux中 C++ main函数参数argc和argv含义及用法 简介 argc 是 argument count的缩写,表示传入main函数的参数个数: argv 是 argument vecto ...

  5. Linux下共享库的查找顺序

    http://www.cnblogs.com/lovevivi/archive/2013/01/15/2861211.html 在接手一个很古老的程序时,发现其所使用的动态库都实在是太陈旧了,正式运行 ...

  6. Linux中dlfcn库相关学习

    博客搬家,原地址:https://langzi989.github.io/2017/10/16/Unix中dl库学习/ 在linux中静态链接库和动态链接库是进程之间代码共享的两种方式.Linux在& ...

  7. linux 下共享库创建及使用

    1.创建共享库 [xpan@localhost 2.5.3]$ ls libhello.c  libhello.h  usehello.c [xpan@localhost 2.5.3]$ gcc -f ...

  8. linux下共享库的制作及常见的问题

    将自己写的链表生成共享库  1.编译  2.设置库名:    库的名称格式:lib + XXX + 版本号.so (库的名称为XXX) -shared 生成共享文件库 -fpic 动态链接    3. ...

  9. Linux 中 3 个文件打包上传和下载相关命令详解

    tar 命令 通过 SSH 访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar 命令就是必不可少的一个功能强大的工具.Linux 中最流行的tar是麻雀虽小,五脏俱全,功能强大. 使用t ...

  10. 简述linux中动态库和静态库的制作调用流程

    假设现在有这些文件:sub.c add.c div.c mul.c mainc head.h(前4个.C文件的头文件) 1.静态库制作流程         gcc -c  sub.c add.c di ...

最新文章

  1. python爬取电影网站信息并写入文件
  2. Citrix Provisioning Services 7.13企业实战
  3. ROS系统 参数的获取和设置
  4. Tkinter的Canvas组件
  5. SQL 触发器的使用
  6. python类方法和实例方法的区别_python中的类方法,实例方法和静态方法的区别
  7. 巨人java生鲜app下载_Java生鲜电商平台-生鲜电商平台SSO(单点登陆)技术方案(小程序/APP)...
  8. vuex的基础小案例(黑马教程)
  9. 小波包分解、重构、去噪与matlab函数使用
  10. VMware 找不到我的计算机
  11. C++-导出类-导出宏-纯虚函数-DllMain函数-调用约定与参数命名
  12. 非满管电磁流量计测量平均流速
  13. 紫光华宇拼音输入法使用技巧
  14. Spring学习笔记
  15. 笔记本连接显示器后没有声音_外接显示器后没声音怎么回事
  16. 地牢大师--(BFS+三维数组)
  17. Java正确获取星期Calendar.DAY_OF_WEEK
  18. 什么软件可以测试sd卡,如何做SD卡测试和SD卡测试工具
  19. mysql查看数据库的容量及表容量
  20. 欧尼酱讲JVM(07)——方法的栖身之所—虚拟机栈

热门文章

  1. 关于Windows高DPI的一些简单总结
  2. [转] Noise Contrastive Estimation 噪声对比估计 资料
  3. SDWebImage常用方法及原理
  4. [LeetCode] One Edit Distance 一个编辑距离
  5. Django REST框架--认证和权限
  6. 诺基亚将于10月26日发布首款WindowsPhone7手机
  7. Mybatis ResultMap Collection 复合主键
  8. 并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制
  9. DirectX11 With Windows SDK--03 索引缓冲区、常量缓冲区
  10. smali注入常用代码