第8章 64ビットシステム環境での32ビットと64ビットのアプリケーション

目次

8.1. ランタイムサポート
8.2. ソフトウェア開発
8.3. biarchプラットフォームでのソフトウェアのコンパイル
8.4. カーネル仕様

SUSE® Linux Enterprise Desktopは、64ビットプラットフォームで利用できます。ただし、付属のすべてのアプリケーションが64ビットプラットフォームに移植されている訳ではありません。SUSE Linux Enterprise Desktopは、32ビットアプリケーションの64ビットシステム環境での使用をサポートしています。この章では、このサポートを64ビットSUSE Linux Enterprise Desktopプラットフォームで実装する方法について簡潔に説明します。また、32ビットアプリケーションの実行方法(ランタイムサポート)、および32ビットと64ビットのシステム環境の両方で実行できるように32ビットアプリケーションをコンパイルする方法について説明します。さらに、カーネルAPIに関する情報、および32ビットアプリケーションを64ビットカーネルで実行する方法についても説明します。

64ビットプラットフォームのamd64およびIntel 64に対応したSUSE Linux Enterprise Desktopは、既存の 32ビットアプリケーションが 64ビット環境で出荷してすぐに動作するように設計されています。このサポートにより、対応する 64ビット移植版が使用可能になるのを待たなくても、使用したい 32ビットアプリケーションを引き続き使用できます。

8.1. ランタイムサポート

[Important]アプリケーションバージョン間の競合

アプリケーションが32ビットと64ビットの両方の環境で使用可能な場合に、両方のバージョンを同時にインストールすると問題が生じます。そのような場合は、2つのバージョンのどちらかだけをインストールして使用してください。

PAM(プラグ可能認証モジュール)は、このルールの例外です。SUSE Linux Enterprise Desktopは、ユーザとアプリケーションを仲介するレイヤとしての認証プロセスでPAMを使用します。また、 32ビットアプリケーションも実行する64ビットオペレーティングシステムでは、常に両バージョンのPAMモジュールをインストールする必要があります。

正しく実行するために、すべてのアプリケーションにはライブラリが必要です。しかし残念ながら、32ビットバージョンと64ビットバージョンのライブラリの名前は同じです。そのため、ライブラリを別の方法で区別する必要があります。

32ビットバージョンとの互換性を維持するために、ライブラリは32ビット環境の場合と同じシステム内の場所に格納されます。libc.so.6の32ビットバージョンは、32ビットと64ビットのどちらの環境でも/lib/libc.so.6の下にあります。

64ビットのすべてのライブラリとオブジェクトファイルは、lib64というディレクトリにあります。通常、/libおよび/usr/libの下にある64ビットのオブジェクトファイルは、/lib64および/usr/lib64の下にあります。つまり、両方のバージョンのファイル名を変更しなくても済むように、32ビットライブラリ用の領域は/libおよび/usr/libの下になっています。

ワードサイズに依存しないデータコンテンツを持つ、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環境は、この原則に従って設計されています。ライブラリを手動で更新した場合は、各自でAPIの問題を解決してください。

8.3. biarchプラットフォームでのソフトウェアのコンパイル

biarchアーキテクチャで他のアーキテクチャ向けのバイナリを開発するには、対象のアーキテクチャのそれぞれのライブラリをさらにインストールする必要があります。これらのパッケージは、rpmname-32bitと呼ばれます。さらに、rpmname-develパッケージからの各ヘッダとライブラリ、およびrpmname-devel-32bitからの2番目のアーキテクチャ向けの開発ライブラリも必要です。

ほとんどのオープンソースプログラムでは、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. カーネル仕様

86_64向けの_64ビットカーネルには、64ビットと32ビットのカーネルABI(アプリケーションバイナリインタフェース)が用意されています。32ビットのカーネルABIは、該当する32ビットカーネルのABIと同じものです。つまり、32ビットアプリケーションが、32ビットカーネルの場合と同様に64ビットカーネルと通信できるということです。

64ビットカーネルのシステムコールの32ビットエミュレーションでは、システムプログラムで使用されるすべてのAPIをサポートしていません。ただし、このサポートの有無はプラットフォームによって異なります。この理由から、lspciのような少数のアプリケーションをコンパイルする必要があります。

64ビットカーネルでは、このカーネル用に特別にコンパイルされた64ビットカーネルモジュールしかロードできません。したがって、32ビットカーネルモジュールを使用することはできません。

[Tip]カーネルロード可能モジュール

一部のアプリケーションには、カーネルでロード可能な個々のモジュールが必要です。64ビットシステム環境でそのような32ビットアプリケーションを使用したい場合は、このアプリケーションおよびSUSEのプロバイダに問い合わせて、このモジュール用に、カーネルにロード可能なモジュールの64ビットバージョンとカーネルAPIの32ビットコンパイルバージョンを入手できるかどうか確認してください。