2010-05-07 64 views
3

我希望也許有人有一個快速的答案,但本質上,當我打開優化,我得到以下錯誤:綠大地 - 小數據區溢出

[elxr] (error) small data area overflow: 0xfff9f6fc (signed) didn't fit in 16 bits while performing relocation in file test_main.o at location __sti___13_test_main_cpp_252229d3+0xc, to reference symbol oe_init_intconn

,當我把在發生類似的錯誤此鏈接器指令以及:

-auto_sda

他們的手冊沒有提及此鏈接器錯誤。我使用的是Integrity 5.10

+0

順便說一句,我遇到過的唯一一件事是提到可能會有某種不兼容的庫構建使用SDA和那些不是。 – Gary 2010-05-07 11:36:31

回答

4

此連接器錯誤是通常-Olink優化-auto_sda無關。鏈接器看到你的整個程序,並會盡量不要通過autoSDAizing超過64K的數據來搞砸它。 (它仍然可能是一個連接錯誤,但這是不可能的。)

這個錯誤通常是因爲有人誰是的感知作爲接頭具有已經投入超過64K字節到SDA部分的連接之前甚至有機會去嘗試一下。該unperceptive人可能是你,如果你不喜歡的東西

#pragma startsda 
int small_data[10000]; // 40Kbytes 
int small_data_also[10000]; // another 40Kbytes 
#pragma endsda 

(可能跨多個文件分割;事實上,我認爲,如果你嘗試創建超過64K SDA的你會得到一個編譯器或彙編診斷一個文件)。

但unperceptive個人也可能是編譯器,如果你傳遞選項,例如-sda=4(因爲如果你扔了#pragma startsda周圍的整個文件中的4個字節或更小的每一個全局變量的作用),你有一個噸的全球變數。編譯器會高興地在每個20個單獨的文件中SDAize 10,000字節,然後鏈接器會抱怨你正在處理200,000字節的SDA。 (鏈接器是足夠聰明,改寫常規數據引用到SDA引用,但從來沒有被教導如何改寫事態朝着相反的方向。)

最後,即使你認爲你不及格-sda=,你可能會感到驚訝。用-#-v選項運行驅動程序。 IIRC,ccintppc默認通過暗號傳遞-sda=4。你可以讓司機停止「幫助」你;只需通過-sda=none-sda=0,這應該覆蓋驅動程序的默認值。您可能需要逐個文件地傳遞此選項,從coldest code開始。

+0

我無法確認它=),我切換了作業,但它聽起來比我的高級修正更詳細。 – Gary 2013-02-05 15:13:47

+0

@Quuxplusone我禁用了SDA,但它沒有解決問題。我使用GHS Multi IDE而不是從命令行。你知道如何使用-v選項。謝謝 – 2016-10-21 10:46:26

+0

@Frankenstein:如果您的錯誤信息與Gary's有任何不同,請發佈一個新問題並將其從評論鏈接到此處。 (a)我不相信你,(b)你只需在你的編譯器選項中加上'-v',這就是全部。 – Quuxplusone 2016-10-21 18:27:42

1

經過一番研究,鏈接所有不使用SDA選項的庫可能會產生此衝突。由於我沒有對這些庫如何建立控制,此刻我已經申請了以下標誌我GPJ,似乎解決該問題:

-Onolink 
-no_auto_sda 
-nothreshold 

注意,這些選項禁用所有鏈接的優化和完全禁用SDA選項。

+0

請注意,最初我不接受這個答案,因爲它不是最好的,並且會歡迎任何改進的想法,這些想法仍然可以進行優化。 – Gary 2010-05-12 11:31:16

+0

我想我已經發布了真實的答案,但我知道這已經太遲了兩年。 ;) – Quuxplusone 2012-09-06 18:05:16

0

我有同樣的問題,這應該修復它爲你太:

編譯器選項-large_sda將允許23位SDA搬遷,而不是16位。那麼你也應該可以毫無問題地使用-sda=all