鏈結詳解 共享庫命名

2021-09-07 03:05:55 字數 888 閱讀 7612

按照共享庫的命名慣例,每個共享庫有三個檔名:real name,soname和linker name。

soname是乙個符號鏈結的名字,只包含共享庫的主版本號,主版本號一致即可保證庫函式的介面一致,

因此應用程式的.dynamic段只記錄共享庫的soname,只要soname一致,這個共享庫就可以用。

使用共享庫可以很方便地公升級庫檔案而不需要重新編譯應用程式,這是靜態庫沒有的優點。

注:libc的版本號有一點特殊,libc-2.8.90.so的主版本號是6而不是2或2.8。

linker name僅在編譯鏈結時使用,gcc的-l選項應該制定linker name所在的目錄。

有的linker name是庫檔案的乙個符號鏈結,有的是一段鏈結指令碼(libc.so)。

示例:real name:/lib/i386-linux-gun/libc-2.15.so

softname: /lib/i386-linux-gun/libc.so.6

linker name: /usr/lib/i386-linux-gun/libc.so

gcc -shared -wl,soname,libstack.so.1 -o libstack.so.1.0 stack.o push.o pop.o is_empty.o

這樣編譯生成的庫檔案是libstack.so.1.0,是real name,soname是libstack.so.1。

需要首先建立linker name:

ln -s libstack.so.1.0 libstack.so

程式編譯需要linker name,程式執行需要soname,最終指向real name。

鏈結詳解 共享庫

組成共享庫的目標檔案和一般目標檔案有所不同,在編譯時要加 fpic選項 生成與位置無關 position independent code gcc c fpic stack stack.c stack push.c stack pop.c stack is empty.c 製作共享庫 gcc sha...

鏈結 靜態庫 共享庫

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

動態鏈結共享庫

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