を使用してソースから gcc 4.x をコンパイルしようとしましたが--with-fpmath=387
、このエラーが発生しています: "Invalid --with-fpmath=387"
. 構成を調べたところ、このオプションがサポートされていないことがわかりました(ドキュメントではまだ可能なオプションとして言及されていますが):
case ${with_fpmath} in
avx)
tm_file="${tm_file} i386/avxmath.h"
;;
sse)
tm_file="${tm_file} i386/ssemath.h"
;;
*)
echo "Invalid --with-fpmath=$with_fpmath" 1>&2
exit 1
基本的に、古いターゲットプラットフォーム用の実行可能ファイルを提供する必要があるため、このすべてを開始しました(実際、古いCeleronですが、DEFAULTによって libstdc++ によって明らかに使用されているSSE2命令はありません)。実行可能ファイルは、libstdc++ のルーチンのコピーから来る最初の命令 (movq XMM0,...) でクラッシュし、「不正な命令」メッセージが表示されます。これを解決する方法はありますか?既存のコード ベースを移植できるようにするには、かなり最近の g++ を使用する必要があります。
古いビルドからこれらのヘッダー/ソースを提供して、通常の x87 命令のサポートを有効にして、SSE 命令が参照されないようにすることは可能でしょうか?
更新: オブジェクト コードに SSE2 命令を含むコンパイル済みの libstdc++ について話していることに注意してください。したがって、問題は gcc コマンド ライン引数に関するものではありません。コードをコンパイルするときに gcc に何を提供していても、SSE2 命令が組み込まれている libstdc++ とリンクします。
本当の答えは、GCC をコンパイルするときに --with-fpmath スイッチを使用しないことです。configure スクリプトの switch ステートメントが sse または avx のみをサポートしていると考えて混乱しましたが、実際にはデフォルト値 (このスイッチには記載されていません) は「387」です。そのため、configure の実行時に --with-fpmath を使用しないようにしてください。それなしでGCCを再コンパイルしたところ、正常に動作するようになりました。
ありがとう。