2017-08-12 3 views
1

デバッグシンボルを有効にして(-g)C++ソフトウェアをビルドしようとしています。問題は、追加のデバッグシンボルが最後のリンクステップが、少なくとも私はそれがあるため、ディスク上の6ギガバイトの上にわずかであることの大きさ、の失敗だと思うリンカがシンボルを読み取れませんでした。不正なアーカイブ

../../lib/libutil.a: could not read symbols: Malformed archive

(で大失敗したことを含め、ライブラリを作ることです)

私は周りを見回し、4GBの静的ライブラリの最大サイズがあるかもしれないというヒントを見つけました。これが64ビットCentOSの私のシステムに当てはまるかどうかわからない:

$ uname -a Linuxホスト2.6.32-431.el6.x86_64#1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 GNU/Linux

私はg ++(GCC)4.8.2コンパイラを使用しています。binutilsのバージョンはGNU ld version 2.20.51.0.2-5.36.el6です。

アーカイブツールやリンカがビルドシステムの内部機能をあまり調整しないで私のオプションを処理できる最大限の制限が4GBある場合(これはオートツールです)

答えて

0

アーカイブの最大サイズは、実際には4ギガバイトです。

ウィキペディアはnice write-up of archive file formatです。あなたが打つと思われる限界は次のとおりです。

  1. 32ビッグエンディアンの整数のセットです。各シンボルに1つ、 は、このシンボルを含む ファイルのヘッダーのアーカイブ内の位置を記録します。

私はこれを解析する方法は、.aファイル内のすべての個々のファイルは、4ギガバイトのカットオフの前に開始しなければならないということです。しかし、この状況でより意味のあるエラーメッセージを得るのはいいでしょう。

これは簡単な方法ではありません。あなたの唯一の現実的な選択肢は、複数の.aアーカイブにリンクされるようにソースコードを切り詰めることです。サイズはそれぞれ4ギガ以下です。

私はこれを回避するのが難しいです。問題の限界はシンボルテーブルの一部で、私はranlibによって作成されると信じています。シンボルテーブルが生成されないように(RANLIB=/bin/trueを設定して)Makefileをハックすると、シンボルファイルが生成されないため、この制限には当てられません。あなたのリンク時間は非常に苦労するでしょう。これにより、arヘッダー自体のファイルサイズの10文字制限のため、9,999,999,999バイトまでのアーカイブを作成することができます。

複数の.aファイルを作成するだけです。

関連する問題