基本的な問題は、ビルドされた実行ファイルのサイズが4GBで、デバッグシンボルをオンにして(デバッグシンボルなしで、 )。どのようにこれらのシンボルがどこから来ているのか、スペースを奪うという点で最大の犯罪者であるかを診断/分析できますか?私は非デバッグの実行可能なサイズを減らすことにいくつかの質問を見つけましたが(しかし、彼らはひどく照らされていません)、ここでは主にデバッグシンボルの乱雑さを減らすことに関心があります。実行ファイルは非常に大きいので、すべてのシンボルをロードするためにgdbにかなりの時間がかかり、デバッグが妨げられています。おそらく、コードの膨らみを減らすことが基本的な作業ですが、私はまず4GBがどこに費やされているか知りたいと思います。 「サイズ--format = SysVの」を介して実行可能ファイルを実行デバッグシンボルのフットプリントの削減(実行ファイルは4GBに膨らんでいます)
私は、次のような出力が得られます。私たちは「debug_strは」〜3.6ギガバイトを取ることを見ることができますね
section size addr
.interp 28 4194872
.note.ABI-tag 32 4194900
.note.gnu.build-id 36 4194932
.gnu.hash 714296 4194968
.dynsym 2728248 4909264
.dynstr 13214041 7637512
.gnu.version 227354 20851554
.gnu.version_r 528 21078912
.rela.dyn 37680 21079440
.rela.plt 15264 21117120
.init 26 21132384
.plt 10192 21132416
.text 25749232 21142608
.fini 9 46891840
.rodata 3089441 46891872
.eh_frame_hdr 584228 49981316
.eh_frame 2574372 50565544
.gcc_except_table 1514577 53139916
.init_array 2152 56753888
.fini_array 8 56756040
.jcr 8 56756048
.data.rel.ro 332264 56756064
.dynamic 992 57088328
.got 704 57089320
.got.plt 5112 57090048
.data 22720 57095168
.bss 1317872 57117888
.comment 44 0
.debug_aranges 2978704 0
.debug_info 278337429 0
.debug_abbrev 1557345 0
.debug_line 13416850 0
.debug_str 3620467085 0
.debug_loc 236168202 0
.debug_ranges 37473728 0
Total 4242540803
いるから。私は100% "debug_str"が何であるか知っているわけではありませんが、それらは文字通りデバッグシンボルの文字列名かもしれないと思いますか?それで、私のシンボルの名前を変更された名前がちょうど光っているほど大きいことを私に伝えていますか?どのようにしてそれらを修正するのですか?
私は何とか「nm」でシンボル名を直接調べることができますが、出力は膨大で、どのように検索するのが最適かわかりません。この種の分析を行うツールはありますか?
コンパイラは 'C++(GCC)4.9.2'でした。そして私は、私がLinux環境で作業していることを言及すべきだと思います。
4Gbはわずか512MBで、おそらく問題はありません。バイナリが4GB〜32Gb以外の場合 –
申し訳ありません。私は4GBを意味します。つまり、 'size'の出力のように〜4e9バイトです。 –
プログラムのリリースバージョンでさえ、非常に大きいです。たぶん、再設計について考えて、複数の(より小さな)モジュールにプログラムを分割するのは時間ですか?複数の実行可能ファイル、または1つの実行可能ファイルと小さな共有ライブラリのセット? –