美文网首页linux
Linux动态库

Linux动态库

作者: 码农练功房 | 来源:发表于2022-10-27 08:59 被阅读0次

动态库名称

Linux上的shared library有三个名字,分别是:

real name

对应文件名称,由主版本号+小版本号+build号组成。比如 libmath.so.1.1.1234libLinux库的约定前缀,math是共享库名字,so是共享库的后缀名,1.1.1234的是共享库的版本号。

主版本号,代表当前动态库的版本,如果共享库的接口发生变化,那么这个版本号就要加1;

后面的两个版本号(小版本号和 build号)是用来指示库的更新迭代号,表示在接口没有改变的情况下,由于需求发生变化等因素,开发的新代码。

so name

运行可执行文件,在加载共享库的时候,应该使用的文件名。其格式为lib + math + .so + (主版本号)。其只包含主版本号。可以通过readelf -d命令查看:

msp@msp-OptiPlex-5040:/home/zpp/test$ readelf -d libtest.so.0.0.0 | grep soname
 0x000000000000000e (SONAME)             Library soname: [libtest.so.0]

so name需要在编译时指定:

gcc -fPIC -o test.o -c test.c
gcc -shared -Wl,-soname,libtest.so.0 -o libtest.so.0.0.0 test.o

其中libtest.so.0so namelibtest.so.0.0.0real name

link name

是专门为应用程序在编译时的链接阶段而用的名字。这个名字就是lib + math +.so ,比如libmath.so。是不带任何版本信息的。

例子

#libtest.so是linkname不带版本号   在可执行文件编译链接的时候使用
lrwxrwxrwx 1 root root   12 10月 25 14:16 libtest.so -> libtest.so.0 

#libtest.so.0是soname带主版本号   可执行文件运行加载时使用
lrwxrwxrwx 1 root root   16 10月 25 14:09 libtest.so.0 -> libtest.so.0.0.0

 #libtest.so.0.0.1是realname  实际加载的动态库文件
-rwxr-xr-x 1 root root 8120 10月 25 14:08 libtest.so.0.0.0 

lrwxrwxrwx 1 root root   16 10月 25 14:13 libtest.so.1 -> libtest.so.1.0.0
-rwxr-xr-x 1 root root 8208 10月 25 14:13 libtest.so.1.0.0
-rwxr-xr-x 1 root root 8600 10月 25 14:16 main
-rw-r--r-- 1 root root   86 10月 25 13:54 main.c
-rw-r--r-- 1 root root 1384 10月 25 13:54 main.o
-rw-r--r-- 1 root root  225 10月 25 14:13 test.c
-rw-r--r-- 1 root root   87 10月 25 14:12 test.h
-rw-r--r-- 1 root root 1896 10月 25 14:13 test.o

其中libtest.solibtest.so.0都是软链接,通过如下方式创建:

ln -s libtest.so.0.0.0  libtest.so.0
ln -s libtest.so.0  libtest.so

使用软链接主要时比较节省磁盘空间,也可以直接将实际的动态库文件拷贝两份,分别重命令为对应的linknamesoname

在可以行文件编译链接动态库时,先通过linkname找到最终找到real name,并且把其中的soname提取出来,写在应用程序自己的文件头的共享库字段里面。

当应用程序运行时,就会通过soname,结合动态链接程序(ld.so),在给定的路径下加载real name的共享库。

参考文献:

  1. linux共享库版本控制及使用_绛洞花主敏明的博客-CSDN博客

相关文章

  • linux下静态库和动态库创建和使用

    linux静态库 .a ===== win 静态库 .lib linux动态库 .so ==== win动态库 ....

  • Linux动态库

    深入探讨Linux静态库与动态库的详解(一看就懂)Linux下动态库的生成和使用Linux下动态库生成和使用转-u...

  • c++编译跨平台动态库

    window编译动态库 linux编译动态库 makefile文件

  • 动态链接库和静态链接库

    动态库和静态库 在Win下,动态库以.dll结尾,静态库以.lib结尾。 在Linux下,动态库文件以.so结尾,...

  • C/C++运行时导入动态库

    运行时导入动态库 动态库 在Linux下的动态库值得通常是.so文件, windows下的动态库通常时.dll文件...

  • iOS代码层获取电量

    1.加载动态链接库 iOS是给予Linux内核,在Linux调用如下函数来加载动态链接库:dlopen,dlsym...

  • 二.gcc 编译链接C文件并使用动态库

    参考 Linux编程练习(二)—— Linux下.so动态库的建立和调用 1.假设我们有一个动态库libHello...

  • 20_链接过程简介

    关键词:静态链接、Linux下静态库的创建和使用、动态链接、 Linux下动态库的创建和使用 1. 问题 工程中的...

  • 2020-10-07

    Linux学习4 Linux下制作和使用静态库和动态库[https://www.cnblogs.com/WindS...

  • 2021-06-16 linux链接so

    linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面...

网友评论

    本文标题:Linux动态库

    本文链接:https://www.haomeiwen.com/subject/bybxtdtx.html