程序员

6、linux共享库的组织

2017-03-13  本文已影响78人  eesly_yuan
共享库版本

libname.so.x.y.z
x主版本号,x不同共享库不兼容
y次版本号,表示增量升级,添加新接口
z发布版本号,修改错误和性能方面的问题
libname.so.x
linux中通常是以so-name作为链接,指向一个实际的最新的动态库,每次按照新共享库后需执行ldconfig将软链接指向最新的共享库
libname.so.x->libname.so.x.y.z

由于历史原因c语言库和动态链接器的so-name如下

ld-linux.so->ld-2.6.1.so
libc.so.6->libc-2.6.1.so
符号版本

之所以提出符号版本的概念是因为次版本交会问题,使用SO-NAME在程序运行时只判断了主版本,但是主版本号相同的共享库也存在的一定的接口数量的差别,这将导致依赖于SO-NAME并不能保证程序可以正常执行(这个也就是次版本交会问题)。
符号版本的基本思路是让共享库的每一个导入导出符号都有一个相关联的版本号,做法上类似名称修饰的方式。

共享库的系统路径

目前大多数linux系统都支持一个叫做FHS(file hierarchy standard)的标准,规定系统中系统文件应该如何放置,各个目录的结构、组织和作用
FHS中规定了三个共享库的放置目录

共享库的查找过程

动态链接模块所依赖的模块路径保存在.dynamic由DT_NEED类型项表示,通常存放的共享库的相对路径,链接在链接时就需要查找到共享库的实际位置,查找顺序如下

与链接相关的环境变量

共享库的创建安装

1、创建

gcc -shared -fPIC -Wl,-soname,my_soname -o libname source_file
-shared 表示生成共享库
-fPIC表示使用地址无关代码技术
-Wl表示把后面的参数传递给链接器,例如-soname表示指定共享库的SO-NAME

2、安装
复制到/lib或者/usr/lib或者/usr/local/lib目录下,然后运行ldconfig
3、共享库脚本
前面提到共享库通常是elf的dso文件,但共享库也可以是一个符合一定格式的脚本,通过这种脚本可以把结构现有的共享库通过一定的方式组合起来,从用户的角度就是一个新的共享库,格式如下

GROUP( /lib/libc.so.6 /lib/libm.so.2)

end~

上一篇 下一篇

猜你喜欢

热点阅读