我知道,當與靜態庫(即libname.a)鏈接時,所使用函數的二進制代碼將從存檔中取出,並且將在應用程序二進制文件中插入。因此,靜態庫必須在編譯時出現。針對共享庫進行編譯時會發生什麼?
但是,與共享庫我迷路了。函數定義不會被複制。然後爲什麼需要在鏈接器命令行上提供共享庫?另外,是否有不同的方式鏈接到共享庫,它們是什麼?
我知道,當與靜態庫(即libname.a)鏈接時,所使用函數的二進制代碼將從存檔中取出,並且將在應用程序二進制文件中插入。因此,靜態庫必須在編譯時出現。針對共享庫進行編譯時會發生什麼?
但是,與共享庫我迷路了。函數定義不會被複制。然後爲什麼需要在鏈接器命令行上提供共享庫?另外,是否有不同的方式鏈接到共享庫,它們是什麼?
需要將共享庫提供給鏈接器的命令行,以便對特定函數和這些函數所在的文件的引用存儲到可執行文件中。當可執行文件運行時,首先加載動態鏈接程序(/lib/ld-linux.so
,/libexec/ld-elf.so
等,取決於您的系統)並檢查這些引用。一旦找到lib文件,它會將它們(使用mmap()
系統調用)映射到程序的地址空間。
您可以通過運行
objdump -T a.out
或
nm -D a.out
對於ELF可執行文件看到這些引用,該.interp
部分的存在意味着程序使用動態鏈接。
參見手冊頁的dlopen和對dlsym顯式動態鏈接裝載機管理。
謝謝。同時,我發現[this](http://www.yolinux.com/TUTORIAL/LibraryArchives-StaticAndDynamic.html)優秀教程,補充您的解釋。 – Vorac 2013-02-25 08:19:41