64ビットFedora 17で32ビットプログラムを実行するにはどうすればよいですか?

64ビットFedora 17で32ビットプログラムを実行するにはどうすればよいですか?

ADT(Android開発ツール)バンドルは「Linux 64ビット」zipパッケージで提供されていますが、次の要件を明記してください。:

64ビットディストリビューションは32ビットアプリケーションを実行できる必要があります。

実際、Fedora 17 64ビットシステムでパッケージ化されたEclipseを実行すると、次のような複数のadb開発ツールを「見つける」ことができないため、エラーが発生しますaapt

aapt 実行エラー: '/home/juuser/local/adt-bundle-linux/sdk/platform-tools/aapt' プログラムを実行できません。エラー=2、対応するファイルまたはディレクトリなし:エラー=2、対応するファイルまたはディレクトリなし

「該当ファイルなし」は $HOME/local の下にあるため、誤解を招くおそれがあります。

adt-bundle-linux/sdk/platform-tools/aapt

しかし、シェルでは実行できません。

~/local $ ./adt-bundle-linux/sdk/platform-tools/aapt 
zsh: no such file or directory: ./adt-bundle-linux/sdk/platform-tools/aapt

ファイルを見る

$ file adt-bundle-linux/sdk/platform-tools/aapt
adt-bundle-linux/sdk/platform-tools/aapt: ELF 32-bit LSB executable, Intel 80386,
 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8,
 not stripped

私たちはそれが32バイナリであることがわかります。そして、私のシステムは(現在)32ビットアプリケーションを実行できないようです。

これをどのように変更できますか?現在、Fedora 64ビットシステムで32ビットアプリケーションを実行するにはどうすればよいですか?

(もちろん、誰かが「Linux 64-bit」というバイナリパッケージに32ビットバイナリを入れた理由を尋ねることもできます。)

答え1

これは、Eclipseが見つからないadbなどに関しては、システムで実行するために必要な32ビット共有ライブラリがないと実行できないためです。

32ビットライブラリの場合、状況は非常に簡単です。適切な32ビットライブラリをインストールするだけです。 64ビットFedora 17インストールでは、デフォルトの64ビットライブラリは/usr/lib64にあり、オプションの32ビットライブラリは/usr/libにあります。したがって、lddSDK/platform-tools/adb を呼び出すと、次のようになります。

linux-gate.so.1 =>  (0xf7791000)
librt.so.1 => /lib/librt.so.1 (0xf776c000)
libncurses.so.5 => /lib/libncurses.so.5 (0xf7747000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf772d000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0xf7644000)
libm.so.6 => /lib/libm.so.6 (0xf7618000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf75fb000)
libc.so.6 => /lib/libc.so.6 (0xf7449000)
/lib/ld-linux.so.2 (0xf7792000)
libdl.so.2 => /lib/libdl.so.2 (0xf7444000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0xf7424000)

これは/usr/lib(/usr/lib64ではない)へのシンボリックリンクである/ libにあります。望むより:

»file /lib/libc.so.6
/lib/libc.so.6: symbolic link to `libc-2.15.so'
»file /lib/libc-2.15.so
/lib/libc-2.15.so: ELF 32-bit LSB shared object [...]

32ビット標準Cライブラリ。あなたができることは、32ビットSDKツールを見つけて、それがどのように機能するかを確認することですldd。まだ例がありませんが、欠落しているものがある場合は、ldd次のように報告してください。

libc.so.6 => ??????

最初ただし、lddを機能させるには、32ビットglibcに付属の32ビットローダが必要です。 (これがなければ、lddはこれを実行できないファイルと呼び、何も伝えません。)

»yum search glibc
glibc.i686 : The GNU libc libraries
glibc.x86_64 : The GNU libc libraries

切り捨てられたがx86_64パッケージはすでに持っているパッケージです。 i686は32ビット版です。だから、ただインストールしてください。

何もコンパイルされないので、「devel」パッケージは必要ありません。それ以外の場合は、経験に基づいて推測およびyum whatprovides/yum searchまたは役に立ちます(adbのリストを確認してください。32ビットバージョンのC ++ lib、ncurses、pthreads、および私が知らないいくつかの項目があります)。

使用法に関するクイックヒントwhatprovides

»yum whatprovides libtinfo
No matches found.
»yum whatprovides libtinfo.so.5
[2 matches]
»yum whatprovides "*/libtinfo.so.5"
[4 matches]

;)

答え2

32ビットglibcをインストールする必要があります。

# yum install glibc.i686

これにより、32ビットバイナリを実行しようとすると、「ファイルやディレクトリがありません」という誤解を招くメッセージが削除されます。これにより、64ビットFedoraシステムは32ビットバイナリを実行できます。

また、ldd32 ビットの動的実行可能ファイルを呼び出すときに表示される誤解を招く「動的実行可能ファイルではない」というメッセージも削除されます。ldd

これで、欠落している32ビットライブラリをインストールする必要があります。以下のバイナリは次のadt-bundle-linux/sdk/platform-toolsリンクにリンクされています。

# yum install zlib.i686 libstdc++.i686 ncurses-libs.i686 libgcc.i686

それはすべてです。

背景

上記のパッケージ名がどのように派生するかについての背景知識です。たとえば、出力を表示します。

$ ldd adb
linux-gate.so.1 =>  (0xf774f000)
librt.so.1 => /lib/librt.so.1 (0xf7725000)
libncurses.so.5 => not found
libpthread.so.0 => /lib/libpthread.so.0 (0xf770b000)
libstdc++.so.6 => not found
libm.so.6 => /lib/libm.so.6 (0xf76df000)
    [..]

adbにまだ2つのライブラリがありません。

各「見つかりません」ごとにパッケージ名を見つける必要があります。例:

$ yum whatprovides '*libstdc++.so.6'
[..]
libstdc++-4.7.2-2.fc17.i686 : GNU Standard C++ Library
[..]

これで、パッケージのデフォルト名に「.i686」を追加して32ビットバージョンを取得します。

答え3

次のコマンドを使用して必要なパッケージをインストールできます。

sudo yum install redhat-lsb.i686

関連情報