章 9. 64 位元系統環境的 32 位元和 64 位元應用程式

目錄

9.1. 執行期間支援
9.2. 軟體開發
9.3. Biarch 平台的軟體編譯
9.4. 核心規格

SUSE® Linux Enterprise Server 可用於多種 64 位元平台。但這並不表示所有包含的應用程式都已移植到 64 位元平台。SUSE Linux Enterprise Server 支援在 64 位元系統環境中使用 32 位元應用程式。本章簡略說明這項支援在 64 位元 SUSE Linux Enterprise Server 平台上的執行方式。它說明 32 位元應用程式的執行方式 (執行期間支援) 以及如何編譯 32 位元應用程式,讓它們在 32 位元和 64 位元兩種系統環境都可執行。另外,您可找到關於核心 API 和 32 位元應用程式如何在 64 位元核心下執行的相關資訊。

適用於 64 位元平台 ia64、ppc64、System z 和 x86_64 的 SUSE Linux Enterprise Server 可讓現有的 32 位元應用程式在此 64 位元環境中執行,打破了常規。對應的 32 位元平台為 x86 (對應 ia64)、ppc (對應 ppc64)、x86 (對應 x86_64)。這項支援意謂您可以繼續使用偏好的 32 位元應用程式,無需等到對應的 64 位元連接埠上市。目前的 ppc64 系統是以 32 位元模式執行大部分應用程式,不過您可以執行 64 位元應用程式。

9.1. 執行期間支援

[Important]不同應用程式版本之間的衝突

如果應用程式有 32 位元和 64 位元兩種版本,同時安裝二種版本,一定會發生問題。在這種狀況下,可在兩種版本中選定一種來安裝並使用。

此規則的一個例外是 PAM (可插入驗證模組)。SUSE Linux Enterprise Server 在驗證程序中使用 PAM 做為使用者與應用程式之間的溝通層。在另外還可執行 32 位元應用程式的 64 位元作業系統上,一律要安裝兩個版本的 PAM 模組。

要正確執行,每一個應用程式都需要一些程式庫。不幸的是,這些程式庫的 32 位元和 64 位元版本,名稱都一樣。它們必須透過其他方法來區分彼此。

要保留與 32 位元版本的相容性,程式庫儲存在系統中的位置,與在 32 位元環境中的位置相同。在 32 位元和 64 位元環境中,libc.so.6 的 32 位元版本都位於 /lib/libc.so.6

所有 64 位元程式庫和物件檔案都位於名為 lib64 的目錄。以往儲存在 /lib/usr/lib 下的 64 位元物件檔案,現在放在 /lib64/usr/lib64 目錄下。這表示在 /lib/usr/lib 之下,有預留空間給 32 位元程式庫使用,因而兩種版本的檔案名稱能夠保持不變。

32 位元 /lib 目錄的子目錄,如果包含不取決於字數的資料內容,則不會移動。此配置與 LSB (Linux Standards Base) 以及 FHS (File System Hierarchy Standard) 相容。

►ipf: ia64 的 64 位元程式庫位於標準 lib 目錄中,系統沒有 lib64 目錄,也沒有 lib32 目錄。ia64 會以模擬方式執行 32 位元 x86 程式碼。一組基本程式庫會安裝在 /emul/ia32-linux/lib/emul/ia32-linux/usr/lib 中。

9.2. 軟體開發

所有 64 位元架構都支援 64 位元物件的開發。對 32 位元編譯的支援層級需視結構而定。以下為 GCC (GNU Compiler Collection) 和 Binutil 的工具鏈的各種執行實作選項,包括組合器 as 以及連結器 ld

Biarch 編譯器

Biarch 開發工具鏈可以產生 32 位元和 64 位元二種物件。Biarch 開發工具鏈可以產生 32 位元和 64 位元物件。幾乎所有平台都預設支援 64 位元物件的編譯。如果使用特殊旗標,就可以產生 32 位元物件。此特殊旗標是適用於 GCC 的 -m32。Binutil 的旗標視結構而定,但是 GCC 會將正確的旗標傳送至連結器和組合器。Biarch 開發工具鏈目前可用於 amd64 (支援 x86 和 amd64 說明的開發)、System z 及 ppc64。32 位元物件一般是建立在 ppc64 平台上。要產生 64 位元物件,必須使用 -m64 旗標。

不支援

SUSE Linux Enterprise Server 不支援在所有平台上直接開發 32 位元軟體。若要在 ia64 底下開發 x86 應用程式,請使用 SUSE Linux Enterprise Server 對應的 32 位元版本。

所有標頭檔案必須使用與結構無關的形式來編寫。安裝的 32 位元和 64 位元程式庫,必須有一個與已安裝標頭檔案相符的 API (應用程式設計介面)。標準 SUSE Linux Enterprise Server 環境根據此原則而設計。對於手動更新的程式庫,請自行解決這些問題。

9.3. Biarch 平台的軟體編譯

若要在 biarch 結構上,為其他結構開發二進位程式,必須為第二個結構額外安裝相關程式庫。如果第二個結構是 32 位元結構,這些套件稱為 rpmname-32bitrpmname-x86 (針對 ia64);如果第二個結構是 64 位元結構,則套件稱為 rpmname-64bit。您還需要 rpmname-devel 套件的各個標頭和程式庫,以及 rpmname-devel-32bitrpmname-devel-64bit 之第二個結構的開發程式庫。

例如,若要編譯一個使用 libaio 的程式,而所在系統的第二個架構是 32 位元架構 (x86_64 或 System z),您需要以下 RPM:

libaio-32bit

32 位元執行期間套件

libaio-devel-32bit

32 位元開發的標題和程式庫

libaio

64 位元執行期間套件

libaio-devel

64 位元開發標題和程式庫

大部份開放原始碼程式使用的程式組態是以 autoconf 為基礎。若要使用 autoconf 為第二個結構設定程式,請覆寫 autoconf 的一般編譯器和連結器設定,方法是執行包含其他環境變數的 configure 程序檔。

以下範例表示的是第二個架構為 x86 的 x86_64 系統:以 ppc 為第二個結構的 ppc64,其範例都與此類似。此範例不適用於無法在其中建立 32 位元套件的 ia64。

  1. 使用 32 位元編譯器:

    CC="gcc -m32"
  2. 指示連結器處理 32 位元物件 (務必使用 gcc 做為連結器前端)︰

    LD="gcc -m32"
  3. 設定組合器來產生 32 位元物件:

    AS="gcc -c -m32"
  4. 指定連結器旗標,例如 32 位元程式庫的位置︰

    LDFLAGS="-L/usr/lib"
  5. 指定 32 位元目標代碼程式庫的位置︰

    --libdir=/usr/lib
  6. 指定 32 位元 X 程式庫的位置︰

    --x-libraries=/usr/lib

並非每一個程式都需要所有這些變數。將它們配合各程式使用。

以下是在 x86_64、ppc64 或 System z 上編譯原生 32 位元應用程式的 configure 呼叫範例:

CC="gcc -m32"
LDFLAGS="-L/usr/lib;"
./configure --prefix=/usr --libdir=/usr/lib --x-libraries=/usr/lib
make
make install

9.4. 核心規格

x86_64、ppc_64 和 System z 適用的 64 位元核心可提供 64 位元和 32 位元兩種核心 ABI (應用程式二進位介面)。後者與相對應 32 位元核心的 ABI 是相同的。這表示 32 位元應用程式可以用與 32 位元核心溝通相同的方式,來與 64 位元核心溝通。

32 位元系統模擬的 64 位元核心呼叫,不支援系統程式使用的所有 API。這要視平台而定。基於這個原因,少數應用程式 (例如 lspci) 必須進行編譯編譯為 64 位元程式,才能在非 ppc64 平台上正確運作。在 IBM System z 上,並非所有 ioctls 都可用於 32 位元核心 ABI 中。

64 位元核心只可以載入為此核心特別編譯的 64 位元核心模組。它無法使用 32 位元核心模組。

[Tip]核心可載入模組

部份應用程式需要個別的核心可載入式模組。如果您想在 64 位元系統環境使用這種 32 位元應用程式,請洽詢此應用程式的提供者以及 SUSE,確定是否可以取得此模組的核心可載入式模組的 64 位元版本以及核心 API 的 32 位元編譯版本。


SUSE Linux Enterprise Server 管理指南 11 SP4