2016-10-21 47 views
0

在參照this answer「在運行時動態鏈接但靜態感知」 - 如何控制加載哪個.so文件?

有兩種Linux的C/C++庫類型。

  • 靜態庫(*.a)是其與連接併成爲本申請的一部分對象代碼檔案。它們被創建爲 ,並可以使用ar(1)命令進行操作(即ar -t libfoo.a將列出庫/檔案中的文件)。

  • 動態鏈接的共享對象庫(*.so)可以以兩種方式使用。

    1. 共享對象庫可以在運行時動態鏈接,但靜態感知。在編譯/鏈接階段,庫必須可用。共享對象不包含在 二進制可執行文件中,但與執行有關。
    2. 共享對象庫可以在執行期間使用動態鏈接加載器系統動態加載/卸載和鏈接功能。

是什麼意思做出動態 LIB tied to the execution

這是否像Windows manifest files,允許應用程序加載在特定的dll

什麼是控制.so加載的機制?
必須有這樣一種機制,否則「編譯」.so是唯一一個允許加載,使其失敗的目的,使其動態

+0

在Windows中,一個可能更簡單明瞭的等價物將是[* import library *](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682592(v = vs。 85).aspx),從模塊定義文件或dll生成,並鏈接到任何模塊想要拉入相關模塊。 – WhozCraig

+0

@WhozCraig你能推薦一個網站,用圖解釋Linux應用程序如何加載和使用**。so **文件? – Adrian

回答

0

這意味着該庫在鏈接時可用,因此鏈接器可以驗證您從.so引用的函數存在於.so中。優點是對這些功能的調用對你來說是透明的。換句話說,如果您鏈​​接到了.so

int foo(double bar); 

你這樣稱呼它

int res = foo(4.2); 

鏈接器可以確保foo是存在的,而且,它需要double類型的一個參數。之後,它將呼叫站點int res = ...「鏈接」到該功能。

在執行期間動態加載/卸載允許您在構建系統上不存在.so(因此,沒有「靜態感知」)而鏈接。爲了增加這種靈活性,您可以打開系統,使其無法在目標.so中找到所需的功能。您的通話順序也看起來比foo(4.2)複雜得多,因爲您需要經過dlopen準備步驟。有關.so的調用函數的更多信息,請參閱this Q&A

相關問題