web-dev-qa-db-ja.com

gccに64ビットプラットフォームで32ビットプログラムをコンパイルさせる

64ビットシステムで使用しようとしている独自のプログラムがあります。

セットアップを起動すると正常に動作しますが、それ自体を更新していくつかのモジュールをコンパイルしようとすると、ロードに失敗します。

Gccを使用しており、gccが64ビットシステム用にコンパイルしようとしているため、このプログラムはこれらのモジュールを使用できないためだと思われます。

Gccに32ビットプラットフォームのすべてを強制的に実行する方法(環境変数など)はありますか。 32ビットのchrootは機能しますか?

59
Jure1873

GCCに-m32フラグを使用させる必要があります。

$PATHに単純なシェルスクリプトを記述してgccを呼び出すことができます(元のgccを上書きしないようにし、$PATHで新しいスクリプトが先に来ることを確認します。 GCCへのフルパス。

必要なコードは、シェルに応じて/bin/gcc -m32 $*のようなものであると思います($*はすべての引数を含めるためにありますが、それは他の何かかもしれませんが、非常に重要です!)

70
Alan Pearce

Alan Pearceの方法を適用して32ビットバイナリを取得できますが、次のようにエラーが発生することもあります。

fatal error: bits/predefs.h: No such file or directory

これが事実であり、apt-getがある場合は、gcc-multilibをインストールするだけです。

Sudo apt-get install gcc-multilib 
44
Geoffrey R.

gcc/g++を使用して直接コンパイルするコードの場合、-m32オプションをコンパイルコマンドラインに追加し、CFLAGSCXXFLAGSLDFLAGSおよびMakefile変数を編集するだけです。

使用しているサードパーティコードについては、ビルド時にクロスコンパイル用に構成することを確認する必要があります。 ./configure --helpを実行し、使用可能なオプションを確認します。ほとんどの場合、CFLAGSCXXFLAGS、およびLDFLAGS変数をconfigureスクリプトに提供できます。また、--build--Hostをconfigureスクリプトに追加して、次のようなものにする必要があるかもしれません。

./configure CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32 --build=x86_64-pc-linux-gnu --Host=i686-pc-linux-gnu

コンパイルが失敗した場合、これはおそらく64ビットマシンに32ビットの開発パッケージをインストールする必要があることを意味します

9
e271p314