我希望也许有人对此有一个快速的答案,但基本上当我打开优化时,我收到以下错误:
[elxr](错误)小数据区溢出:0xfff9f6fc(有符号)在位置 __sti___13_test_main_cpp_252229d3+0xc 的文件 test_main.o 中执行重定位时不适合 16 位,以引用符号 oe_init_intconn
当我输入此链接器指令时也会发生类似的错误:
-auto_sda
他们的手册没有提到这个链接器错误。我正在使用 Integrity 5.10
我希望也许有人对此有一个快速的答案,但基本上当我打开优化时,我收到以下错误:
[elxr](错误)小数据区溢出:0xfff9f6fc(有符号)在位置 __sti___13_test_main_cpp_252229d3+0xc 的文件 test_main.o 中执行重定位时不适合 16 位,以引用符号 oe_init_intconn
当我输入此链接器指令时也会发生类似的错误:
-auto_sda
他们的手册没有提到这个链接器错误。我正在使用 Integrity 5.10
此链接器错误通常与-Olink
优化无关-auto_sda
。链接器会看到您的整个程序,并会尽量不通过对超过 64K 的数据进行自动 SDA 处理来搞砸它。(它可能仍然是一个链接器错误,但这不太可能。)
发生此错误通常是因为在链接器有机会尝试之前,某些人已经将超过 64K 字节放入 SDA 节中。如果您做了类似的事情,那么没有洞察力的人可能是您
#pragma startsda
int small_data[10000]; // 40Kbytes
int small_data_also[10000]; // another 40Kbytes
#pragma endsda
(可能拆分为多个文件;事实上,如果您尝试在单个文件中创建超过 64K 的 SDA,我认为您将获得编译器或汇编器诊断)。
但是,如果您要传递诸如-sda=4
(这就像您#pragma startsda
在整个文件中围绕每个 4 字节或更小的全局变量抛出一个)之类的选项,并且您有大量的全局变量,那么不敏感的人也可能是编译器。编译器会很高兴地在 20 个单独文件中的每个文件中对 10,000 字节进行 SDAize,然后链接器会抱怨您正在处理 200,000 字节的 SDA。(链接器足够聪明,可以将常规数据引用重写为 SDA 引用,但从未教过如何以相反的方向重写。)
最后,即使您认为自己没有通过-sda=
,您也可能会感到惊讶。-#
使用or-v
选项运行驱动程序。IIRC,默认ccintppc
秘密通过-sda=4
。你可以让司机停止“帮助”你;只需通过-sda=none
or -sda=0
,它应该覆盖驱动程序的默认值。您可能希望从最冷的代码开始逐个文件传递此选项。
在做了一些研究之后,链接所有不使用 SDA 选项的库可能会出现这种冲突。由于我无法控制这些库的构建方式,目前我已将以下标志应用于我的 GPJ,这似乎解决了该问题:
-Onolink
-no_auto_sda
-nothreshold
请注意,这些选项禁用所有链接器优化并完全禁用 SDA 选项。
我有同样的问题,这也应该为你解决:
编译器选项-large_sda
将允许 23 位 SDA 重定位而不是 16 位。那么你也应该能够-sda=all
毫无问题地使用。