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

目錄

8.1. 執行期間支援
8.2. 軟體開發
8.3. Biarch 平台的軟體編譯
8.4. 核心規格

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

針對 amd64 與 Intel 64 等 64 位元平台所設計的 SUSE Linux Enterprise Desktop,可讓現有的 32 位元應用程式不需額外的設定即可在 64 位元環境中執行。這項支援意謂您可以繼續使用偏好的 32 位元應用程式,無需等到對應的 64 位元連接埠上市。

8.1. 執行期間支援

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

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

此規則的一個例外是 PAM (可插入驗證模組)。SUSE Linux Enterprise Desktop 在驗證程序中將 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) 相容。

8.2. 軟體開發

Biarch 開發工具鏈可以產生 32 位元和 64 位元物件。預設是編譯 64 位元物件。使用特殊旗標可以產生 32 位元物件。GCC 的特殊旗標是 -m32

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

8.3. Biarch 平台的軟體編譯

若要在 biarch 架構上,為其他結構開發二進位程式,必須為第二個結構額外安裝相關程式庫。這些套件稱為 rpmname-32bit。您也需要 rpmname-devel 套件的個別標頭和程式庫,以及 rpmname-devel-32bit 第二個架構的開發程式庫。

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

以下範例,將 x86 的 x86_64 系統指示為第二個架構:

  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

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

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

8.4. 核心規格

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

32 位元系統模擬的 64 位元核心呼叫,不支援系統程式使用的所有 API。這要視平台而定。基於這個原因,少數應用程式 (例如 lspci) 必須進行編譯。

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

[Tip]核心可載入模組

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