我希望有人可以快速回答这个问题,但基本上当我启用优化时,我会收到以下错误:
[elxr](错误)小数据区 溢出:0xfff9f6fc(签名)没有 在执行时适合16位 在文件test_main.o中重定位 位置__sti ___ 13_test_main_cpp_252229d3 + 0xc,参考符号oe_init_intconn
当我输入此链接器指令时也会发生类似的错误:
-auto_sda
他们的手册没有提到这个链接器错误。我正在使用Integrity 5.10
答案 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
。