Linux中的動態連接庫

一、linux下動態連接庫格式一般爲libxxx.so.x.y.z,其中x爲主版本號,y爲次版本號,z爲發行版本號。這個庫稱爲realname。不一樣主版本間庫不兼容;次版本號用於增量升級,保持向後兼容;發行版本號對應消缺與性能提高,不影響兼容性。linux

二、一般一個動態連接庫會定義一個soname,通常命名爲libxxx.so.x。bash

(1)能夠用readelf -d libxxx.so.x.y.z 來查看libxxx.so.x.y.z的soname。性能

(2)生成動態連接庫時,使用以下格式生成:gcc -shared -Wl,-soname,lib_soname -o lib_realname file_list 。例如:g++ -g -fPIC -shared -Wl,-soname,libfun.so.1 -o libfun.so.1.0.0 fun.o code

三、編譯使用動態庫的程序時,連接器只認不帶任何版本的動態庫名(linker name)。編譯

(1)、如上面的例子,創建libfun.so.1和libfun.so,都軟連接到libfun.so.1.0.0。class

(2)使用g++ -g -o demo001 demo001.cpp -lfun -L. 編譯生成demo001可執行程序。編譯時g++找的是libfun.so。兼容性

(3)使用ldd ./demo001 查看,能夠看到demo001找的動態庫是libfun.so.1,即運行時找的是soname的庫。gcc

gelare@Carrot:~/code/cpp/demo001$ ldd ./demo001
        linux-vdso.so.1 =>  (0x00007ffecc16a000)
        libfun.so.1 => ./libfun.so.1 (0x00007fef4ceea000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fef4cccc000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fef4c905000)
        /lib64/ld-linux-x86-64.so.2 (0x000055b43664e000)
相關文章
相關標籤/搜索