2011-08-24 48 views
4

我有一個源文件,廣泛利用的模板。 我也在那個文件中顯式實例化了不同的模板......其中很多。 該文件被編譯爲靜態庫的一部分。我在多個平臺上編譯這個 庫以用於多種體系結構:Win x86, Linux x86和Linux ARM。對於Linux構建我用不同的編譯器 因此產生的文件(我說的是這裏的ELF文件 本身的上下文中)是不同的:對於GCC生成的目標文件是8.4MB大小 並擁有40000多一點ELF部分;對於ARM編譯器(armcc) 生成的文件是12.7MB大小,擁有超過90000 ELF 部分(!);在這兩種情況下我都有調試信息。模板 - 龐大的目標文件會導致死機鏈接

會發生什麼事是,在鏈接時使用ARM鏈接器扼流圈和模具試圖 鏈接靜態庫巨大的目標文件。經過一番調查,似乎 ,它無法處理其中有超過65536 ELF部分的目標文件(我仍然有 從編譯器供應商獲得確認,雖然...或者我在做 某件事情完全和完全錯誤) 。我發現的解決方案是將文件拆分成多個較小的文件(它的結構和內部允許的內容)。

的問題(S):是否有任何其他的替代解決方案?難道是 可能編譯器生成的目標文件中額外的代碼(在模板的上下文中) 鏈接階段之前?

+3

「一個未簽名的short應該足夠給每個人,沒有人會有超過65536個ELF部分...... 「 –

回答

1

使用ARM RVCT編譯器(armcc),請嘗試將--remove_unneeded_entities添加到命令行。這可能會或可能沒有太大的影響,具體取決於您使用的是哪個版本的編譯器,但它的值得一試

+0

我正在使用最新版本的編譯器。您建議的標誌適用於某些文件,但不適用於所有:),這意味着鏈接器仍然會崩潰以查找其他文件。如果我想使用ARM工具,我將不得不拆分我的文件...不知道我是否會這樣做,因爲GCC(x86和CodeSourcery for ARM)都能完美地處理代碼。我在ARM支持網站上打開了一個錯誤,但我不希望看到任何壯觀的東西。我現在對ARM工具非常失望,我想我可能已經在窗口中投入了大量資金,因爲這與ARM工具一起在地獄裏呆了一週 – celavek

+0

嗯,我想你可以嘗試的另一件事是64位ARM鏈接器?我認爲從RVCT4.1開始就可以使用64位鏈接器 – NullPointer