簡體   English   中英

C可執行代碼獨立於共享庫

[英]C executable code independence from shared libraries

我正在讀一本關於gcc的書,以下段落讓我困惑:

此外,共享庫可以更新庫而無需重新編譯使用它的程序(前提是庫的接口不會更改)。

這只是指尚未聯系的節目,對吧? 我的意思是,在C中是不是可執行代碼完全獨立於編譯器? 在哪種情況下,對庫的任何更改,無論其接口或實現是否與可執行代碼無關?

在執行程序之前,不會鏈接 共享庫,因此可以升級/更改庫而無需重新編譯(也不需要重新鏈接)。

EG,在Linux上,人們可能會有

    /bin/myprogram

依賴於

    /usr/lib64/mylibrary.so

用不同的版本替換mylibrary.so (只要它導出的函數/符號相同/兼容)將在下次啟動myprogram時影響myprogram 在Linux上,這由系統程序/lib64/ld-linux-x864-64.so.2或類似程序處理,系統在程序啟動時自動運行。

靜態庫對比, 靜態庫在編譯時鏈接。 對靜態庫的更改需要重新鏈接應用程序。

另外一個好處是,如果兩個程序共享同一個共享庫,則內存占用量可以更小,因為內核可以“告訴”它是相同的代碼,而不是將其復制到RAM中兩次。 對於靜態庫,情況並非如此。

不,這是在談論一個鏈接代碼。 如果鏈接到靜態庫並更改庫,則可執行文件將不會獲取更改,因為它包含自己的庫原始版本副本。

如果鏈接到共享庫(也稱為動態鏈接) ,則可執行文件不包含庫的副本。 程序運行時,會將當前版本的庫加載到內存中。 這允許您修復庫,修復程序將被庫的所有用戶選中,而無需重新鏈接。

庫為外界提供接口(API)。 使用庫的應用程序(例如.DLL)綁定到接口(意味着它們從API調用函數)。 只要不修改接口,庫作者就可以自由地修改庫並重新分發新版本。

如果庫作者要修改接口,他們可能會破壞依賴於該功能的所有應用程序!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM