在 Linux x64 上鍊接 x86 共享庫


簡介

動態連結庫,也稱為共享庫,是編譯後的程式碼、資料和資源的集合,應用程式可以在執行時載入和執行它們。共享庫通常用於 Linux 應用程式的開發,並且是 x86 架構不可或缺的一部分。在本文中,我們將探討在 Linux x64 系統上鍊接 x86 共享庫的過程。

瞭解 x86 共享庫

x86 共享庫是一個包含編譯後的程式碼、資料和資源的檔案,這些檔案可以在執行時由多個應用程式共享。共享庫僅在應用程式需要時才載入到記憶體中,從而減少了應用程式的記憶體佔用。共享庫通常用於在多個應用程式之間共享程式碼,或為應用程式提供附加功能。

x86 共享庫格式的設計目標是平臺無關性,這意味著在一個系統上編譯的共享庫可以在另一個系統上使用,只要這兩個系統具有相同的架構即可。這使得 x86 共享庫成為建立可移植軟體的理想解決方案。

連結 x86 共享庫

要在 Linux x64 上將應用程式連結到 x86 共享庫,我們需要遵循以下步驟:

步驟 1:建立共享庫

第一步是建立我們想要與應用程式連結的共享庫。只要它為 x86 架構編譯,我們就可以使用任何程式語言來建立共享庫。

在本例中,我們將使用 C 程式語言建立一個名為 libexample.so 的共享庫。我們將在共享庫中建立一個簡單的函式,該函式將兩個整數相加並返回結果。

這是我們的共享庫程式碼:

int add(int a, int b) {
   return a + b;
}

要建立共享庫,我們需要使用以下命令編譯程式碼:

gcc -shared -o libexample.so example.c

此命令將在當前目錄中建立一個名為 libexample.so 的共享庫。

步驟 2:將應用程式連結到共享庫

下一步是將我們的應用程式連結到共享庫。為此,我們需要在連結器命令中使用 -l 選項。

這是我們的應用程式程式碼:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
   int a = 10;
   int b = 20;
   int c = add(a, b);
    
   printf("The result is: %d
", c); return 0; }

要將應用程式連結到共享庫,我們需要使用以下命令編譯程式碼:

gcc -o app app.c -L. -lexample

此命令將我們的應用程式連結到共享庫 libexample.so。

步驟 3:執行應用程式

最後一步是執行我們的應用程式。我們可以透過執行以下命令來實現:

./app

這將執行我們的應用程式並將函式呼叫的結果列印到控制檯。

其他注意事項

連結共享庫時,我們需要記住一些其他注意事項。以下是一些注意事項:

庫搜尋路徑

連結共享庫時,連結器需要知道在哪裡找到庫。預設情況下,連結器會在一些標準目錄中查詢庫,例如 /usr/lib 和 /usr/local/lib。但是,如果我們的庫位於不同的目錄中,我們需要告訴連結器在哪裡找到它。

我們可以使用 -L 選項後跟目錄路徑來實現。例如,如果我們的庫位於 /home/user/lib 目錄中,我們可以使用以下命令將我們的應用程式連結到庫:

gcc -o app app.c -L/home/user/lib -lexample

符號可見性

建立共享庫時,我們可以指定庫匯出的符號的可見性。預設情況下,共享庫中的所有符號對於與庫連結的其他應用程式都是可見的。但是,如果多個庫匯出具有相同名稱的符號,這可能會導致命名衝突。

為了避免這種情況,我們可以使用可見性屬性來指定每個符號的可見性。可見性有三個級別:預設、隱藏和受保護。預設可見性意味著該符號對於與庫連結的其他應用程式是可見的。隱藏可見性意味著該符號僅在庫內可見。受保護的可見性類似於隱藏,但允許派生類訪問該符號。

要指定符號的可見性,我們可以使用屬性 ((visibility("visibility_type"))) 屬性。例如,要使名為 add() 的函式隱藏,我們可以使用以下程式碼:

int __attribute__ ((visibility("hidden"))) add(int a, int b) {
   return a + b;
}

連結器標誌

連結共享庫時,我們可以使用許多連結器標誌來自定義連結過程。以下是一些常用的標誌:

  • -shared − 此標誌用於建立共享庫。它告訴連結器生成共享庫而不是可執行檔案。

  • -fPIC − 此標誌用於生成位置無關程式碼。建立共享庫時需要此標誌,因為它允許庫載入到記憶體中的任何地址。

  • -Wl,-rpath=directory − 此標誌用於指定執行時庫搜尋路徑。它告訴連結器在執行時將目錄包含在搜尋共享庫的目錄列表中。

結論

在本文中,我們探討了在 Linux x64 系統上鍊接 x86 共享庫的過程。我們瞭解瞭如何使用共享庫在多個應用程式之間共享程式碼,以及如何使用它們為應用程式提供附加功能。透過遵循本文中概述的步驟,我們可以輕鬆地將我們的應用程式連結到 Linux x64 系統上的 x86 共享庫。

更新於:2023年3月3日

瀏覽量:312

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.