8

ブーストスピリットQicompiler_tutorialから大規模で複雑な例(テンプレートのインスタンス化に関してより複雑になるように変更)を作成しようとすると、次のエラーメッセージが表示されます。

 debug\expression.o:-1: error: section .debug_frame$_ZNK5boost5proto3if_INS0_6detail7has_tagINS0_6tagns_3tag7greaterEEENS0_12reverse_foldINS0_1_ENS0_6_stateENS2_18reverse_fold_tree_IS6_NS_6spirit6detail18make_binary_helperINSC_13meta_compilerINSC_2qi6domainEE12meta_grammarEEEEEEESK_E4implIRNSG_4ruleINSC_3lex7lexertl8iteratorINSR_7functorINSR_14position_tokenIN9__gnu_cxx17__normal_iteratorIPKcSsEENS_3mpl6vectorISsN4mpl_2naES13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_EENS12_5bool_ILb0EEEyEENSR_6detail4dataESZ_NS15_ILb1EEES16_EEEEFSt4listIN7client3ast10expressionIdEESaIS1H_EEvENSC_11unused_typeES1L_S1L_EENS_6fusion4consINSG_12literal_charINSC_13char_encoding8standardELb1ELb0EEENS1O_4nil_EEERS1L_EclES1N_RKS1V_S1W_: string table overflow at offset 10000433

コマンドライン:

c:/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/4.7.2/cc1plus.exe -quiet -v -I c:/libs/boost/include -I ../src/compiler -I c:/libs/boost/include -I . -I c:/libs/Qt-static/mkspecs/win32-g++-x64-4.7.2-corei7-avx-corei7-avx -iprefix c:\mingw64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/ -D_REENTRANT -U_REENTRANT -D BOOST_THREAD_POSIX -D BOOST_THREAD_USE_LIB -D UNICODE -D QT_LARGEFILE_SUPPORT -D _DEBUG=1 -D DEBUG=1 -D BOOST_SPIRIT_QI_DEBUG=1 -D BOOST_SPIRIT_NO_PREDEFINED_TERMINALS=1 ../src/compiler/expression.cpp -quiet -dumpbase expression.cpp -m64 -march=corei7-avx -mtune=corei7-avx -mtls-dialect=gnu2 -auxbase-strip debug/expression.o -g -O0 -Wall -Wextra -std=gnu++11 -version -fsignaling-nans -fno-math-errno -frtti -fexceptions -o - |

-m64プラットフォーム: 8GBの物理メモリを備えたx64 Windows 7 HB上のx64ホストおよびターゲット()(gcc 4.7.2に準拠)用のmingw-builds(x64-4.7.2-release-posix-sjlj-rev5.7z) 。

十分なメモリがないためのようです。

この問題を回避するにはどうすればよいですか?ここには再帰的なテンプレートはないと確信しています。

4

2 に答える 2

13

この質問に対する1つの答えは不十分であることがわかりましたが、さらに調査した結果、より高い最適化レベルでgccを実行することが、この問題を回避する方法であるように見えます。学んだことを共有したいと思いました。

この問題は、Windowsが使用するPE/COFF形式でバイナリを書き込む場合に固有です。binutilsのソースを調べて、bfdのcoffバックエンドコードでこのコードスニペット/コメントを見つけました:

/* An inherent limitation of the /nnnnnnn notation used to indicate
the offset of the long name in the string table is that we
cannot address entries beyone the ten million byte boundary.  */
if (string_size >= 10000000)
{
  bfd_set_error (bfd_error_file_too_big);
  (*_bfd_error_handler)
    (_("%B: section %s: string table overflow at offset %ld"),
    abfd, current->name, string_size);
  return FALSE;
}

バイナリの文字列テーブルは、PE/COFFで最大1,000万バイトになる可能性があるように見えます。それを制約する唯一のことは、セクションテーブルエントリのフォーマットがセクション名に8バイトしか指定していないことだと思います。名前がそれより長い場合は、文字列テーブルへのオフセットを指定できます。数値は、UTF-8でエンコードされた文字列のASCIIで表され、スラッシュで始まる必要があります。これでは、10進数の7桁しか得られないため、10,000,000の制限があります。これは、MicrosoftのPE/COFF仕様リビジョン8.1のセクション13で見つかりました。

バイナリ形式を実際に判断することはできないので、私が知っている唯一の回避策は、gccに小さな文字列テーブルを作成させることです。-O2は私のためにトリックをしました。

于 2015-04-06T21:07:07.497 に答える
7

私も同様の問題を抱えており、解決策を見つけました。Boost.Spirit2パーサーのブーストテンプレートクラスをたくさん使用しています。

openSuse 12.2(gcc 4.7.2)でMingW64クロスコンパイラを使用しています。MingW32は、リリースでもデバッグモードでも、同じファイルを問題なくコンパイルできます。

指図:

/ usr / bin / x86_64-w64-mingw32-g ++ -c -fpermissive -fexceptions -Wall -Wextra -Wno-long-long -Wno-unknown-pragmas -mthreads -Wall -frtti -finline-functions -o file.o file .cpp

出力:

セクション 。PDATA $ _ZN5boost6fusion6detail10linear_anyINS0_13cons_iteratorIKNS0_4consINS_6spirit2qi6kleeneINS6_10char_classINS5_3tag9char_codeINS9_5spaceENS5_13char_encoding8standardEEEEEEENS4_INS6_11alternativeINS4_INS6_6actionINSI_INSI_INS6_8sequenceINS4_INSI_INS6_14literal_stringIRA11_KcLb1EEENS_7phoenix5actorINSP_9compositeINSP_6detail13function_evalILi2EEENS0_6vectorINSP_5valueINSP_3stl9push_backEEENSP_9referenceISsEENSW_IcEENS0_5void_ES13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_EEEEEEEENS4_INS6_16lexeme_directiveINS7_INSI_INS6_10differenceINS8_INSA_INS9_5char_ESD_EEEENS6_10eol_parserEEENSQ_INSR_ISU_NSV_ISZ_S11_NS5_8argumentILi0EEES13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_Ssos-nightly@suse-x86-64:〜/ mnt / joseph / suse / build__ming_SF_EEEENS4_ISG_NS0_3nilEEEEEEEEEEENS4_INS6_4plusINSI_INS6_9referenceIKNS6_4ruleIN9__gnu_cxx17__normal_iteratorIPSL_SsEEFN7dynardo9structure11SimplexDataEvENS_5proto7exprns_4exprINS2A_6tagns_3tag8terminalENS2A_7argsns_4termINSA_INS9_5blankESD_EEEELl0EEENS5_11unused_typeES2M_EEEENSQ_INSR_ISU_NSV_INSW_INSS_19member_function_ptrILi1EvM11My_PushbackINS27_20SimplexDataContainerEEFvRKS28_EEEEENSW_IPS2T_EES1G_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_EEEEEEEEEES1T_EEEEEEEEEEEENSQ_INSR_ISU_NSV_INSW_INSX_6insertEEENS10_ISt3mapISsS2S_St4lessISsESaISt4pairIKSsS2S_EEEEENS10_IS3I_ISsS2S_EEES13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_EEEEEEEENSQ_INSR_INST_ILi1EEENSV_INSW_INSX_5clearEEES11_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_EEEEEEEENSQ_INSR_IS3U_NSV_IS3W_NS10_IS2S_EES13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_S13_EEEEEEEENS4_INSI_INSI_INSI_INSJ_INS4_INSK_IRA9_SL_Lb1EEENS4_IS1S_NS4_ISG_S37_EEEEEEEES3S_EES3Z_EES44_EENS4_INSJ_IS1V_EES1T_EEEEEEEES1T_EEEEEENS3_IKS1T_EENS6_6detail13fail_functionIS25_KS2M_NS8_IS2J_EEEEEEbRKT_RKT0_RT1_N4mpl_5bool_ILb0EEE:アセンブラメッセージ:オフセット10002537 /tmp/ccMd36nu.sの文字列テーブルのオーバーフロー:/tmp/ccMd36nu.s:致命的なエラー:debug / osl_lsdyna_k_parser.oを閉じることができません:ファイルが大きすぎます

不足している最適化オプションが問題のようです。-O1または-O2を追加する

/ usr / bin / x86_64-w64-mingw32-g ++ -c -fpermissive -fexceptions -Wall -Wextra -Wno-long-long -Wno-unknown-pragmas -mthreads -Wall -frtti -O1 -g -o file.o file .cpp

私の問題を修正し、デバッグオプション(-g)も許可します!

于 2013-01-30T10:30:10.637 に答える