32ビットプログラムを64ビットFedora 17で実行する方法


10

Android Development Tools(ADT)バンドルは、「Linux 64ビット」のzipパッケージとして入手できますが、次の要件が記載されています

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

それはいくつかの開発ツール、例えば「検索」ができないため、実際に、ちょうど、エラーではFedora 17 64ビットシステムの結果について、パッケージ日食を実行していますadbaapt

aaptの実行エラー:プログラムを実行できません "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt":error = 2、No such file or directory:error = 2、No such file or directory

「そのようなファイルはありません」は、$ 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ビットアプリケーションを実行できるようにするにはどうすればよいですか?

(もちろん、誰かが32ビットのバイナリを「Linux 64ビット」と呼ばれるバイナリパッケージに入れてしまう理由を尋ねることもできます...)


AskFedoraの答えと同様の質問:ask.fedoraproject.org/question/365/...
gertvdijk

回答:


9

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)

これらはすべて/ libにあることに注意してください。これは/ usr / libへのシンボリックリンクです(/ usr / lib64ではありません)。見て:

»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]

;)


では、i686バージョンのライブラリをインストールしてみますldd。その理由:fileバンドルバージョンのadbディスプレイを呼び出すと確信が持てません:ELF 32ビットLSB実行可能ファイル、Intel 80386 -ARMエミュレーションとは関係ありません-/ usr / bin / adb(android-tools fedoraパッケージから) ELF 64ビットLSB実行可能ファイルx86-64として実際に利用可能です。
maxschlepzig

lddを呼び出すとadt-bundle-linux/sdk/platform-tools/adb、「動的実行可能ファイルではない」と表示されます。PATHに関して-これは問題ではありません-例えば./adt-bundle-linux/sdk/platform-tools/adbターミナルでのパスの完全な指定は機能しません(結果として 'zsh:no such file or directory [..]'になります)。
maxschlepzig

glibc.i686はまだインストールされていますか?私が言ったように、lddが動作するには32ビットのローダーが(おそらく)必要であり、それはglibcパッケージに含まれるでしょう。WRT adbは32ビットのIntel Archであるため、これはシステムであるため、ARM用にコンパイルされたものはそこで機能しません。ただし、同じ32ビットのものをARM用にコンパイルすることでき、その一部はAndroidデバイスで使用されていると思います。それが必要であることは間違っているかもしれませんが、いずれにせよ、それが利用可能なものであり、それほど面倒なことではありません。
goldilocks

パスをWRTします。おそらくEclipseには必要ありません。また、ファイルを実行できない場合でも、コマンドラインで同じエラーが発生する可能性があります。libsをインストールするなどすれば、すぐにわかります。
goldilocks

2
32ビットプログラムであるエミュレータと、32ビットプロセッサを搭載したエミュレートされたプラットフォームとの間に関係はありません。Androidエミュレーターは実際にはQemuに基づいており、ホストアーキテクチャーに関係なく、armv7(32ビット)、armv8(64ビット)、x86、amd64、mips、mips64などの多くをエミュレートできます。
Gilles「SO-悪をやめなさい」

8

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

# yum install glibc.i686

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

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

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

# 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ビットバージョンを取得します。


この答えは素晴らしいです。特に最初の部分です。実際にインストールglibc.i686するlddと、i386バイナリを適切に処理できます。
クリスティアン2018年

2

必要なパッケージは次の方法でインストールできます。

sudo yum install redhat-lsb.i686
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.