64ビットから32ビットアーキテクチャのクロスコンパイル(FreeBSD)

64ビットから32ビットアーキテクチャのクロスコンパイル(FreeBSD)

64ビットFreeBSDシステムで32ビットFreeBSDアーキテクチャ用のライブラリをクロスコンパイルするのに問題があります。どんなアドバイス/アドバイスでも喜んでいただきます。同じアーキテクチャ(64ビット)でコンパイルすると正常に動作します。

ポート lang/gcc9 および lang/gcc9-devel を構築しました。ポート構成では、32ビットと64ビットの両方に対してビルドする必要がある「multilib」を有効にしました。私のシステムで利用可能なlibstdcを検索すると、次のようになります。

[root@build /usr/local/share/ohNet-build4FreeBSD/ohNet-ohNet_1.17.2776]# find / -iname "*libstdc*"
/usr/local/share/gcc-9.2.0/python/libstdcxx
/usr/local/lib32/gcc9/libstdc++.so.6.0.27
/usr/local/lib32/gcc9/libstdc++.so
/usr/local/lib32/gcc9/libstdc++.so.6
/usr/local/lib32/gcc9/libstdc++.so.6.0.27-gdb.py
/usr/local/lib32/gcc9/libstdc++.a
/usr/local/lib32/gcc9/libstdc++fs.a
/usr/local/lib/gcc9/libstdc++.so.6.0.27
/usr/local/lib/gcc9/libstdc++fs.a
/usr/local/lib/gcc9/libstdc++.so.6
/usr/local/lib/gcc9/libstdc++.so
/usr/local/lib/gcc9/libstdc++.a
/usr/local/lib/gcc9/libstdc++.so.6.0.27-gdb.py
/usr/ports/lang/libstdc++_stldoc_4.2.2

64ビット用にコンパイルすると、プロジェクトが正しく構築されます。 32ビット用にコンパイルするときに、次の環境変数を設定しました。

export CROSS_COMPILE_CFLAGS=-m32
export CROSS_COMPILE_LINKFLAGS=-m32

そしてビルドが失敗します

/usr/local/bin/ld: skipping incompatible /usr/local/lib/gcc9/gcc/x86_64-portbld-freebsd11.2/9.2.1/../../../libstdc++.a when searching for -lstdc++
/usr/local/bin/ld: cannot find -lstdc++

私が正しく理解した場合、コンパイラには互換性のある32ビットライブラリがありますが、見つかりません(上記を参照)。この問題を解決する正しい方法を教えてください。

ベストアンサー1

私は遅れていることを知っていますが、私もこの問題に遭遇し、良い解決策を見つけるのに苦労しています。 GCCを使用すると、独自のライブラリパスが見つからないようです-m32。主な問題は、FreeBSDがlibc++FreeBSD 11に戻り、stdc++使用できなくなることです。

私が動作させることができる唯一の方法は次のとおりです。

  1. .Honestlyでコンパイルすると、GCCが間違ったライブラリパスでLDを呼び出そうとすることを実行時に示している-B/usr/lib32 -B/usr/local/lib32/gcc9/ため、これはGCCのバグのように見えます。g++ main.cpp -vこれら2つのフラグはそれを修正します。最初のものはGCC 7以下でのみ必要です(GCC 8以降では/ usr / lib32で見ることができます)。次のバージョンはG ++のすべてのバージョンに必要です。gcc9実際にGCCに付属のバージョンと交換してください。
  2. プログラムはコンパイルされますが、実行時に見つかりませんlibstdc++.so.6。使用するか-static-libstdc++(私のプラグインベースのプログラムには良いオプションではありません。30個のDLLはすべて1MBしか増えませんでした)、名前にもかかわらずx86とamd64のcompat9x-amd64バージョンを追加するインストールを選択してください。パスを表示するには、再起動またはlibstdc++.so.6再実行する必要があります。ldconfigGCCはAMD64ライブラリのldconfigに設定ファイルを追加しますが、lib32の設定ファイルはないため、これはGCCのバグのように見えます(ldconfig32専用システムがあるにもかかわらず)。このcompat9xパッケージはlibstdc ++を提供し、ldconfig設定ファイルも追加します。

この設定を使用してプログラムを正常に構築しましたが、まだFreeBSDのmultilibサポートは非​​常に悪いと思います(多くのLinuxディストリビューションはより良いmultilibサポートを提供し、32ビットライブラリと64ビットライブラリを並べてインストールできます。他の一部のディストリビューションでは、マルチアーキテクチャもサポートされています。AMD64のarmやpowerpcなどの基本アーキテクチャと並行して外部アーキテクチャのクロスコンパイルを追加することもできます。

おすすめ記事