4

GCC バージョン 3.4.5 に同梱されている MinGW 5.1.6 / MSYS 1.0.11 (どちらも Sourceforge.org の自動インストーラ) で実行する GCC 4 シリーズのコンパイラをコンパイルする試みを先週ほど試みました。 . 最終目標は GCC 4.5 をインストールすることですが、4.xx コンパイラをビルドすることができませんでした。

異常な動作を引き起こす一連のビルド命令に絞り込みました。コンパイラは以下を実行します。

build/genmodes.exe > tmp-modes.c
/bin/sh ../../gcc-4.2.4/gcc/../move-if-change tmp-modes.c insn-modes.c
echo timestamp > s-modes
gcc -c   -g -fkeep-inline-functions -DIN_GCC   -W -Wall -Wwrite-strings
-Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wmissing-format-attribute
-fno-common   -DHAVE_CONFIG_H -I. -I. -I../../gcc-4.2.4/gcc -I../../gcc-4.2.4/gcc/.
-I../../gcc-4.2.4/gcc/../include -I./../intl -I../../gcc-4.2.4/gcc/../libcpp/include
-I../../gcc-4.2.4/gcc/../libdecnumber -I../libdecnumber    insn-modes.c -o insn-modes.o

cc1.exe: out of memory allocating 2239725803 bytes
make[3]: *** [insn-modes.o] Error 1
make[3]: Leaving directory `/home/root/gcc-4.2.4-build/gcc'
make[2]: *** [all-stage1-gcc] Error 2
make[2]: Leaving directory `/home/root/gcc-4.2.4-build'
make[1]: *** [stage1-bubble] Error 2
make[1]: Leaving directory `/home/root/gcc-4.2.4-build'
make: *** [all] Error 2

主な問題は、genmodes.exe の呼び出しにあるようです。これは、サイズが約 2GB の C ファイル (insn-modes.c) を作成します。これは、私が知る限り、ほとんどが空白で埋められています (ところどころに C コードの行が散らばっていますが)。GCC 3.4.5 はそれをチョークし、それがビルドの終了方法です。私が試したすべてのバージョンで同様の動作が見られますが、4.5 は別の理由で失敗し、コンパイラの中間バージョンを使用することで解決できると期待していました。

だから、3つの質問:

  1. 他の誰かがこれを経験しましたか?
  2. 何が原因ですか?
  3. 回避策が存在する場合はどうなりますか?

64 ビットの Windows 7 マシンでこれを実行しようとしています。

ありがとう。

更新: 2 つの疑わしいファイルの圧縮コピーをこの場所にアップロードしました。 min-insn-modes.c も必要以上に大きいことがわかります。2 つのファイル (合計 3 GB 以上) は 121 KB に圧縮されます。

4

3 に答える 3

3

私も同じ問題を抱えてる; genmodes.c の tagged_printf に絞り込みました。失敗した理由はまだわかりませんが、tagd_printf の定義 (do から while まで) を次のように置き換えると、問題が解決しました。

#define tagged_printf(FMT, ARG, TAG) printf(" " FMT ",\n", ARG)

于 2010-07-24T21:12:12.430 に答える
2

insn-modes.c を巨大にしたり、空白で埋めたりしないでください。genmodes が誤動作しています。なぜそのように失敗するのかはわかりませんが、insn-modes.c を見てみたいと思います (.zip ファイルに入れれば、可能な限り圧縮する必要があります)。合理的にどこかにアップロードし、URLを質問に編集してください)。

ファイル ( ) からすべての余分な空白を手動で削除tr -s ' \r\n\t\v\f' ' 'すると、コンパイル可能なものが得られる場合があります。

編集:あなたがアップロードした min-insn-modes.c を見ましたが、Bryan が正しいと思います. にバグがありtagged_printfます: 呼び出されるたびに、700 万個のスペース文字が出力されます. Bryan の変更により、このハードルを乗り越えることができます。または、定義を次のように変更することで、もう少し調査することができます。

#define tagged_printf(FMT, ARG, TAG) do { \
    int count_ = printf (" " FMT ",", ARG); \
    printf ("\t/* %s [%d], */\n", TAG, count_); \
} while (0)

これにより、ビルドも成功するはずです。その変更が加えられた min-insn-modes.c を見たいと思います。(insn-modes.c も必要ありません。)

追加: emit_insn_modes_h()関数 を調べてください。上記と同様に変更する必要がある%n指定子を持つ printf も含まれています。

int count_ = printf ("  %smode,", m->name);

この変更がなければ、insn-modes.hも大量のスペースで埋められます。

于 2010-07-24T05:55:31.840 に答える
2

MSDN のドキュメントには次のように書かれています。

セキュリティに関するメモ %n 形式は本質的に安全ではなく、既定では無効になっています。フォーマット文字列で %n が検出された場合、「パラメーターの検証」で説明されているように、無効なパラメーター ハンドラーが呼び出されます。%n サポートを有効にするには、 を参照してください_set_printf_count_output

したがって、_set_printf_count_output(1) で問題が解決するはずです。はい、これは最悪です。

于 2010-08-09T10:28:08.997 に答える