鏈結詳解 共享庫

2021-09-07 03:05:55 字數 1058 閱讀 1446

組成共享庫的目標檔案和一般目標檔案有所不同,在編譯時要加-fpic選項(生成與位置無關** position independent code)。

$gcc -c -fpic stack/stack.c stack/push.c stack/pop.c stack/is_empty.c

製作共享庫:

$gcc -shared -o libstack.so stack.o push.o pop.o is_empty.o

共享庫的搜尋路徑:

$gcc main.c -g -l. -lstack -istack -o main

$./main

./main:error while loading shared libraries:libstack.so:cannot open shared object file:no such file or directory.

ldd檢視可執行檔案依賴於哪些共享庫:

$ldd main

1. 首先在環境變數ld_library_path所記錄的路徑中查詢。

2. 然後從快取檔案/etc/ld.so.cache中查詢。這個快取檔案由ldconfig命令讀取配置檔案/etc/ld.so.conf之後生成。

3. 如果上述步驟都找不到,則到系統預設的路徑中查詢,/usr/lib,然後是/lib。

新增搜尋路徑方法:

1. $export ld_library_path=. ./main 

臨時性,不推薦。

2.把動態庫絕對路徑新增到/etc/ld.so.conf中(每個路徑一行),然後執行ldconfig。(推薦)

ldconfig除了處理/etc/ld.so.conf中配置的目錄之外,還處理一些預設目錄,如/lib,/usr/lib等,    

處理之後生成/etc/ld.so.cache快取檔案,動態鏈結器就從這個快取中搜尋共享庫。

3. 把共享庫拷貝到/usr/lib或/lib目錄。

1. 2. 鏈結時庫的順序問題

3. undefined reference to: ***

4. 剖析共享程式庫

鏈結詳解 共享庫命名

按照共享庫的命名慣例,每個共享庫有三個檔名 real name,soname和linker name。soname是乙個符號鏈結的名字,只包含共享庫的主版本號,主版本號一致即可保證庫函式的介面一致,因此應用程式的.dynamic段只記錄共享庫的soname,只要soname一致,這個共享庫就可以用。...

鏈結 靜態庫 共享庫

編譯器生成可重定位目標檔案 o 鏈結器,將不同的可重定位檔案,進行符號解析,重定位等操作。鏈結到一起。生成最終的可執行檔案。編譯器生成的目標檔案,從位址0開始。重定位操作,將不同的模組中的位址,與最終記憶體位址對應。將庫檔案拷貝,嵌入可執行檔案中。鏈結發生在編譯期間,程式執行之前。生成的最終程式中,...

動態鏈結共享庫

靜態庫有一些明顯的缺陷,它與所有的軟體一樣,需要定期維護和更新。如果應用程式設計師想要使用乙個庫的最新版本,他們必須以某種方式了解到該庫的更新情況,然後顯示的將他們的程式與更新了的庫重新鏈結。其次,幾乎每乙個c程式都使用了標準i o函式,執行時這些函式的 會被複製到每個執行程序的文字段中,在執行上百...