私は共有オブジェクトとしてコンパイルされた大きなプロジェクトを扱っています。 DWARF-2シンボル(-g -feliminate-unused-debug-types
)でコンパイルすると、.debug_info
は約700Mになります。DWARF-2重複シンボルを削除するとメモリが枯渇する
私は-feliminate-dwarf2-dups
を追加する場合、リンカは死ぬ:
error adding symbols: Memory exhausted
ld returned 1 exit status
これは4GのRAMを搭載したシステムです。これは広範囲のシステムでコンパイルする必要があるため、4G RAMを消費することは受け入れられません。 --no-keep-memory
をld
に渡そうとしましたが、それでも失敗します。
ldは通常、入力ファイルのシンボルテーブルをメモリにキャッシュすることで、メモリ使用量のスピードを最適化します。このオプションは、必要に応じてシンボルテーブルを再読み込みすることによって、代わりにldにメモリ使用量を最適化するよう指示します。これは、大きな実行可能ファイルをリンクしているときにldがメモリ領域を使い果たした場合に必要になることがあります。
私はld
負荷にメモリ内のすべてのシンボルを推測している、それはディスク上に格納するのにかかる5+倍のメモリを取るdupesを、見つけることについて行きます。
これを段階的に行う簡単な方法はありますか?以下のような:任意の重複削除する最初の.oファイルから
- ロードのシンボル次の.oファイル
- からのシンボルは、それらをマージ
- ロード、
- 後藤2.
私ができますファイルを2つずつ一時アーカイブにリンクし、それらを2つなどにリンクしますが、私はのはこのプロジェクトのビルドプロセスを変更したくありません。たぶん私はobjcopy
これらのセグメントを削除するために使用することができます、別々に二重排除を実行し、最後のELFにデバッグセクションを挿入?
これらのDWARFマージを実行できるツールはありますか? dwarfdump
はファイルのみを読み取ります。あるいは、実際にファイルをリンクするのではなく、gcc
/ld
を呼び出すだけでいいですか?
一緒にリンクされている小さなプロジェクトに分割することはできますか? – OMGtechy
@OMGtechyそれは独自のプロジェクトです。 CFLAGSを追加するだけでなく、makeプロセスのいくつかの場所で小さなツールを動かすだけで1ヶ月以上の作業が必要になります。 – mtijanic
http://stackoverflow.com/questions/1413171/what -is-strip-gcc-application-used-forのいずれかを使用して、重複したシンボルを削除するか、b)不要なものを削除して問題のサイズを小さくするかを確認してください。 – OMGtechy