共享庫(Shared Libary)/動態鏈接庫

http://feizf.blogbus.com/logs/6586196.html

 

 

有兩種方法使用lib庫
    static library 連接時連接器將產生一個獨立的object文件(這些object文件保存着程序所要引用的函數和數據)的copy。
    shared library 用這樣連接出來的程序僅在可執行程序中存儲着共享庫的名字和一些程序引用到的標號。在運行時,動態連接器(在ELF中也叫做程序解釋器)將把共享庫映象到進程的虛擬地址空間裏去,通過名字解析在共享庫中的標號。該處理過程也稱爲動態連接(dynamic linking)

一個簡單的彙編使用libc鏈接庫的例子如下:
.section .data
helloworld:
.ascii "hello world/n/0"
.section .text
.globl _start
_start:
pushl $helloworld
call printf
pushl $0
call exit

編譯連接
# as helloworld-lib.s -o helloworld-lib.o
# ld -dynamic-linker /lib/ld-linux.so.2 /
-o helloworld-lib helloworld-lib.o -lc
# ./helloworld-lib
hello world 

其中, -dynamic-linker /lib/ld-linux.so.2 表示設置動態鏈接器爲ld-linux.so.2
-lc 告訴linker在libc.so這個共享庫文件中尋找函數.

使用ldd命令可以查看可執行文件用到的共享庫
# ldd helloworld-lib
        linux-gate.so.1 =>  (0x00f20000)
        libc.so.6 => /lib/libc.so.6 (0x00112000)
        /lib/ld-linux.so.2 (0x0052b000)

dynamically-linked 在Windows平臺叫dll動態鏈接庫,在Linux平臺下稱爲共享庫,一般存放在/lib、
/usr/lib目錄下,是以.so(shared object)作爲後綴的文件. 使用objdump命令可以查看某個共享庫的內容,如:
# objdump -R /lib/libc-2.4.so
如果想查看某個共享庫的詳細信息,可以從網上查找文檔。
從網址 http://www.gnu.org/software/libc/manual/ 可以看到完整的libc manual.


創建和使用共享庫

--------------------------------------------------------------
Programming from Ground Up 的第7章有個例子, 其中add-year-robust.s爲主程序,
當鏈接生成目標可執行程序時需要鏈接下面的一些.o文件
#as add-year-robust.s -o add-year-robust.o
#ld add-year-robust.o read-record.o write-record.o error-exit.o /
count-chars.o write-newline.o  -o add-year-robust
--------------------------------------------------------------

現在要把所有這些.o用到的文件做成一個共享庫librecord.so (這也符合共享庫的含義,可以被其他程序使用), 如下:
# ld -shared write-record.o read-record.o count-chars.o /
error-exit.o write-newline.o -o librecord.so

接着來使用這個共享庫
# as add-year-robust.s -o add-year-robust.o
# ld -L . -dynamic-linker /lib/ld-linux.so.2 /
-o add-year-robust -lrecord add-year-robust.o

其中:
-L . 告訴linker在當前目錄尋找共享庫
-dynamic-linker /lib/ld-linux.so.2 設置動態鏈接器爲ld-linux.so.2
-lrecord 告訴linker在librecord.so這個共享庫文件中尋找函數. (-lfile表示libfile.so)


上面生成的程序運行時,可能會出現錯誤提示如下
./add-year-robust: error while loading shared libraries:
librecord.so: cannot open shared object file: No such
file or directory

這是因爲默認情況下linker只在/lib、/usr/lib和/etc/ld.so.conf中列出的目錄中尋找共享庫. 所以要想正常運行程序,要麼把共享庫移到相關目錄下,要麼修改LD_LIBRARY_PATH把當前目錄.加入
# LD_LIBRARY_PATH=.
# export LD_LIBRARY_PATH
或者
# setenv LD_LIBRARY_PATH


man ld.so 可以看到很多關於Linux動態鏈接的信息. 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章