2017-08-12 97 views
1

我正嘗試構建一個啓用了調試符號的C++軟件(-g)。問題是,額外的調試符號作出這樣大的,最後的鏈接步驟失敗,鏈接器無法讀取符號:格式不正確的存檔

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

(至少我認爲它是失敗的,因爲它的大小,這略微超過6 GB磁盤上所包含的庫)

我環顧四周,發現提示說可能有4 GB的靜態庫的最大大小。不知道這是否適用於我的系統,這是一個64位的CentOS:

$ UNAME -a Linux主機2.6.32-431.el6.x86_64#1 SMP週五11月22日3時15分09秒UTC 2013 x86_64的x86_64的x86_64 GNU/Linux

我正在使用g ++(GCC)4.8.2編譯器,而binutils版本是GNU ld版本2.20.51.0.2-5.36.el6。

如果確實存在4GB的最大限制,那麼歸檔工具或鏈接器可以處理我的選項,而不用過多地使用構建系統的內部過程(這是自動工具)?

回答

0

它看起來像存檔的最大大小,實際上是四千兆字節。

維基百科有一個nice write-up of archive file format。您似乎遇到的限制是:

  1. 一組32位大端整數。每個符號一個, 記錄包含此符號的 文件標題歸檔文件中的位置。

我解析它的方式是,在.a文件中的所有個人文件必須在4 GB的截止之前啓動。雖然,在這種情況下獲得更有意義的錯誤信息會很好。

沒有簡單的方法解決這個問題。你唯一可行的選擇是砍掉你的源代碼,以便將它鏈接到多個.a檔案中,每個檔案大小不超過4個。

我確實看到了一個很難解決的問題。有關的限制是符號表的一部分,我相信這是由ranlib創建的。如果你破解了你的Makefile,以至於沒有生成符號表(可能是通過設置RANLIB=/bin/true),那麼不會生成符號文件,所以你不會達到這個限制。由於ar標題本身的文件大小限制爲10個字符,因此您的鏈接時間會受到很大的影響,並且這隻允許您創建最多9,999,999,999個字節的檔案(沒有比您已經創建的更多)。

只需創建多個.a文件。