動態(tài)庫名稱
Linux上的shared library有三個名字,分別是:
real name
對應(yīng)文件名稱推励,由主版本號+小版本號+build號組成腾务。比如 libmath.so.1.1.1234
捂龄,lib
是Linux
庫的約定前綴揩慕,math
是共享庫名字,so
是共享庫的后綴名侮攀,1.1.1234
的是共享庫的版本號锣枝。
主版本號,代表當(dāng)前動態(tài)庫的版本兰英,如果共享庫的接口發(fā)生變化撇叁,那么這個版本號就要加1;
后面的兩個版本號(小版本號和 build號)是用來指示庫的更新迭代號畦贸,表示在接口沒有改變的情況下陨闹,由于需求發(fā)生變化等因素,開發(fā)的新代碼家制。
so name
運(yùn)行可執(zhí)行文件正林,在加載共享庫的時候,應(yīng)該使用的文件名颤殴。其格式為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.0
是so name
杈绸, libtest.so.0.0.0
是real name
。
link name
是專門為應(yīng)用程序在編譯時的鏈接階段而用的名字矮瘟。這個名字就是lib + math +.so
,比如libmath.so
瞳脓。是不帶任何版本信息的。
例子
#libtest.so是linkname不帶版本號 在可執(zhí)行文件編譯鏈接的時候使用
lrwxrwxrwx 1 root root 12 10月 25 14:16 libtest.so -> libtest.so.0
#libtest.so.0是soname帶主版本號 可執(zhí)行文件運(yùn)行加載時使用
lrwxrwxrwx 1 root root 16 10月 25 14:09 libtest.so.0 -> libtest.so.0.0.0
#libtest.so.0.0.1是realname 實際加載的動態(tài)庫文件
-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.so
和libtest.so.0
都是軟鏈接澈侠,通過如下方式創(chuàng)建:
ln -s libtest.so.0.0.0 libtest.so.0
ln -s libtest.so.0 libtest.so
使用軟鏈接主要時比較節(jié)省磁盤空間劫侧,也可以直接將實際的動態(tài)庫文件拷貝兩份,分別重命令為對應(yīng)的linkname
和soname
哨啃。
在可以行文件編譯鏈接動態(tài)庫時烧栋,先通過linkname
找到最終找到real name
,并且把其中的soname
提取出來拳球,寫在應(yīng)用程序自己的文件頭的共享庫字段里面审姓。
當(dāng)應(yīng)用程序運(yùn)行時,就會通過soname
祝峻,結(jié)合動態(tài)鏈接程序(ld.so)
魔吐,在給定的路徑下加載real name
的共享庫扎筒。