2013-02-22 92 views
4

我知道,當與靜態庫(即libname.a)鏈接時,所使用函數的二進制代碼將從存檔中取出,並且將在應用程序二進制文件中插入。因此,靜態庫必須在編譯時出現。針對共享庫進行編譯時會發生什麼?

但是,與共享庫我迷路了。函數定義不會被複制。然後爲什麼需要在鏈接器命令行上提供共享庫?另外,是否有不同的方式鏈接到共享庫,它們是什麼?

回答

4

需要將共享庫提供給鏈接器的命令行,以便對特定函數和這些函數所在的文件的引用存儲到可執行文件中。當可執行文件運行時,首先加載動態鏈接程序(/lib/ld-linux.so,/libexec/ld-elf.so等,取決於您的系統)並檢查這些引用。一旦找到lib文件,它會將它們(使用mmap()系統調用)映射到程序的地址空間。

您可以通過運行

objdump -T a.out 

nm -D a.out 

對於ELF可執行文件看到這些引用,該.interp部分的存在意味着程序使用動態鏈接。

+0

謝謝。同時,我發現[this](http://www.yolinux.com/TUTORIAL/LibraryArchives-StaticAndDynamic.html)優秀教程,補充您的解釋。 – Vorac 2013-02-25 08:19:41

0

參見手冊頁的dlopen對dlsym顯式動態鏈接裝載機管理。