第6章 64 ビット環境における 32 ビットおよび 64 ビットアプリケーション

目次

6.1. ランタイムサポート
6.2. ソフトウエア開発
6.3. 両プラットフォーム対応のソフトウエアコンパイル
6.4. カーネル仕様

openSUSE® は 64 ビット環境でも ご利用いただけます。これは、必ずしも全てのアプリケーションが 64 ビット プラットフォームに移植されたことを示しているわけではありません。また、 openSUSE は 64 ビット環境下での 32 ビットアプリケーションの使用に ついてもサポートしています。この章では、 64ビットの openSUSE プラットフォームがどの程度サポートされているのかについて、概要を示しています。 それ以外にも、 32 ビットアプリケーションがどのように実行されるのか (ランタイム サポート) や、 32 ビットと 64 ビットの両方の環境で動作する 32 ビット アプリケーションは、どのようにコンパイルされるべきかについても述べています。 さらに、 64 ビットカーネルで 32 ビットアプリケーションを動作させるにあたっての カーネル API や、その他の説明などについても記しています。

また、 64 ビット環境 である amd64 と Intel 64 向けの openSUSE は、既存の 32 ビットアプリケーションを そのまま 利用することができます。 これは、 32 ビットアプリケーションが 64 ビット対応になるのを待つことなく、 お使いのアプリケーションを使い続けられることを意味しています。

6.1. ランタイムサポート

[Important]アプリケーションバージョン間の矛盾

あるアプリケーションについて、 32 ビットと 64 ビットの両方の版が用意されて いる場合、両方の版を同時にインストールしてしまうと、問題を引き起こして しまいます。この場合、 2 つの版のどちらをインストールするのかを決めておき、 いずれか片方だけをインストールしてください。

唯一の例外は PAM (pluggable authentication modules) です。 openSUSE では、ユーザとアプリケーションの間を調整する認証プロセスとして PAM を使用しています。 32 ビットアプリケーションも動作する 64 ビット オペレーティングシステムでは、常に両方の版の PAM モジュールをインストールして おく必要があります。

正しく動作させるため、それぞれのアプリケーションは様々なライブラリを必要と します。これらライブラリの 32 ビット版と 64 ビット版は、いずれも同じ名前が 設定されています。それぞれは間違えないよう、何らかの方法で区別しなければ なりません。

32 ビットバージョンとの互換性を確保するため、従来の (32 ビット版の) ライブラリは 32 ビット環境の場合と同じ場所に保存されます。 32 ビット版の libc.so.6 は、 32 ビット環境でも 64 ビット環境でも /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) に準拠しています。

6.2. ソフトウエア開発

両対応の開発ツールチェインを利用すると、 32 ビットと 64 ビットの両方の オブジェクトを生成することができます。既定では 64 ビットオブジェクトを 生成しますが、 32 ビットオブジェクトを生成する際には、特殊なフラグを 指定する必要があります。 gcc の場合、 -m32 を指定します。

また、全てのヘッダファイルはアーキテクチャに依存しない形式で記述しておく 必要があります。インストール済みの 32 ビットおよび 64 ビットライブラリには、 インストール済みのヘッダファイルに対応した API (アプリケーション プログラミングインターフェイス) が含まれていなければなりません。 通常の openSUSE 環境は、この方針に則った形になっています。 ライブラリを手動で更新するような場合は、これらの問題をご自身で解決する必要 があります。

6.3. 両プラットフォーム対応のソフトウエアコンパイル

両方のアーキテクチャに対応したバイナリを開発するには、それぞれ関連する ライブラリに対するもう一つのアーキテクチャ版をインストールしておかなければ なりません。これらのパッケージは (RPM 名)-32bit のような名前になっています。また、 (RPM 名)-devel の ような開発パッケージであれば、 (RPM 名)-devel-32bit のような名前で開発パッケージも提供されています。

多くのオープンソースプログラムでは、 autoconf をベース にしたプログラム設定を行なっています。もう 1 つの (たとえば 32 ビット) 版 に対応するプログラムをコンパイルするよう autoconf で 設定を行なうには、 configure スクリプトを実行する際に 通常のコンパイラおよびリンカーの設定を上書きし、追加の環境変数を設定して ください。

下記の例では、 x86_64 システムで x86 をもう 1 つのアーキテクチャとして 使用しています。

  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

6.4. カーネル仕様

x86_64 向けの 64 ビットカーネルでは、 64 ビットと 32 ビットの両方のカーネル ABI (アプリケーションバイナリ インターフェイス) を提供しています。 32 ビット版の ABI は、 32ビット カーネルが提供するものと同じものです。これにより、 32 ビットアプリケーションは 32 ビットカーネルの場合と同様に、 64 ビットカーネルと対話することができる、 ということになります。

64 ビットカーネルが提供するシステムコールの 32 ビット版には、全ての API が 提供されているわけではありません。対応可否はプラットフォームによって異なり ます。このため、 たとえば lspci などの少数のアプリケーションについては、コンパイルし直す必要があります。

また 64 ビットのカーネルは、そのカーネル向けにコンパイルされた 64 ビットの カーネルモジュールのみを読み込むことができます。 32 ビット版のカーネル モジュールを読み込むことはできません。

[Tip]カーネルの読み込みモジュール

アプリケーションによっては、個別のカーネルモジュールを必要とする場合が あります。このような 32 ビットアプリケーションを 64 ビットシステムの環境で 使いたい場合は、そのアプリケーションの製造元と SUSE に対して 64 ビット版 のカーネルモジュールを提供していないかどうか、および 32 ビット版に対応した カーネル API が存在しているかどうか、それぞれお尋ねください。


openSUSE リファレンス 13.1