当前位置: 技术问答>linux和unix
关于程序启动加载so文件的问题
来源: 互联网 发布时间:2016-01-27
本文导语: 编译时我用的是gcc -l,但是程序运行时偏偏加载lib.so.,为什么后面会多出一个版本号阿? | 其实可能是同一个文件。你ls -l看一下是否链接文件。类似这样: lrwxrwxrwx 1 root root 16...
编译时我用的是gcc -l,但是程序运行时偏偏加载lib.so.,为什么后面会多出一个版本号阿?
|
其实可能是同一个文件。你ls -l看一下是否链接文件。类似这样:
lrwxrwxrwx 1 root root 16 Nov 9 2006 libpcap.so -> libpcap.so.0.8.1
lrwxrwxrwx 1 root root 16 Nov 9 2006 libpcap.so.0 -> libpcap.so.0.8.1
上面的例子,libpcap.so 和libpcap.so.0都是指到同一个文件libpcap.so.0.8.1,后者才是真正的库文件,之所以建一些链接,是为了便于程序链接,这样就不会依赖于具体的版本号。
lrwxrwxrwx 1 root root 16 Nov 9 2006 libpcap.so -> libpcap.so.0.8.1
lrwxrwxrwx 1 root root 16 Nov 9 2006 libpcap.so.0 -> libpcap.so.0.8.1
上面的例子,libpcap.so 和libpcap.so.0都是指到同一个文件libpcap.so.0.8.1,后者才是真正的库文件,之所以建一些链接,是为了便于程序链接,这样就不会依赖于具体的版本号。
|
楼上说的没错, 这些都是建的link文件, 方便程序连接用.
|
可以看看共享库几个名称直接的关系:
soname搜名:lib+库名+.so+version
如libtest.so.1
实名 搜名+.+子版本号+.+发布号 如libtest.so.1.0.1
搜名通常是实名符号连接。
连名 linkername 通常是没有任何版本号名称,如libtest.so
因此,程序运行时候,找的是搜名。用lDD可以看到依赖的是搜名。
soname搜名:lib+库名+.so+version
如libtest.so.1
实名 搜名+.+子版本号+.+发布号 如libtest.so.1.0.1
搜名通常是实名符号连接。
连名 linkername 通常是没有任何版本号名称,如libtest.so
因此,程序运行时候,找的是搜名。用lDD可以看到依赖的是搜名。