GreenHills - 小数据区溢出

时间:2010-05-07 11:32:57

标签: embedded real-time linker-errors integrity greenhills

我希望有人可以快速回答这个问题,但基本上当我启用优化时,我会收到以下错误:

  

[elxr](错误)小数据区   溢出:0xfff9f6fc(签名)没有   在执行时适合16位   在文件test_main.o中重定位       位置__sti ___ 13_test_main_cpp_252229d3 + 0xc,参考符号oe_init_intconn

当我输入此链接器指令时也会发生类似的错误:

  

-auto_sda

他们的手册没有提到这个链接器错误。我正在使用Integrity 5.10

3 个答案:

答案 0 :(得分:5)

此链接器错误通常-Olink优化-auto_sda无关。链接器会看到您的整个程序,并尝试不通过autoSDAizing超过64K的数据来搞砸它。 (它可能仍然是一个链接器错误,但这不太可能。)

这个错误通常会发生,因为与链接器一样敏感的人已经将超过64K字节放入SDA部分,然后链接器才有机会拥有去吧。如果你做了像

这样的事情,那么无法理解的个体可能就是你
#pragma startsda
int small_data[10000];  // 40Kbytes
int small_data_also[10000];  // another 40Kbytes
#pragma endsda

(可能分为多个文件;实际上,如果您尝试在单个文件中创建超过64K的SDA,我认为您将获得编译器或汇编器诊断。)

但是,如果你传递-sda=4之类的选项(就像你在每个4字节或更小的全局变量周围抛出一个#pragma startsda那么,那个不知情的人也可能是编译器。整个文件)你有很多全局变量。编译器将很乐意在20个单独文件中的每个文件中SDAize 10,000个字节,然后链接器会抱怨您正在处理200,000个字节的SDA。 (链接器足够聪明,可以将常规数据引用重写为SDA引用,但从未被教过如何以相反的方向重写事物。)

最后,即使你认为你没有通过-sda=,你可能会感到惊讶。使用-#-v选项运行驱动程序。 IIRC,ccintppc默认秘密通过-sda=4。你可以让司机停止“帮助”你;只需传递-sda=none-sda=0,它应覆盖驱动程序的默认值。您可能希望逐个文件传递此选项,从coldest code开始。

答案 1 :(得分:1)

在做了一些研究之后,链接所有不使用SDA选项的库可能会发生这种冲突。由于我无法控制这些库的构建方式,目前我已将以下标志应用于我的GPJ,似乎解决了这个问题:

-Onolink
-no_auto_sda
-nothreshold

请注意,这些选项会禁用所有链接器优化并完全禁用SDA选项。

答案 2 :(得分:0)

我有同样的问题,这也应该适合你:

编译器选项-large_sda将允许23位SDA重定位而不是16位。然后你也应该可以毫无问题地使用-sda=all