4

我希望也许有人对此有一个快速的答案,但基本上当我打开优化时,我收到以下错误:

[elxr](错误)小数据区溢出:0xfff9f6fc(有符号)在位置 __sti___13_test_main_cpp_252229d3+0xc 的文件 test_main.o 中执行重定位时不适合 16 位,以引用符号 oe_init_intconn

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

-auto_sda

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

4

3 回答 3

5

此链接器错误通常-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=noneor -sda=0,它应该覆盖驱动程序的默认值。您可能希望从最冷的代码开始逐个文件传递此选项。

于 2012-09-06T18:03:48.923 回答
1

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

-Onolink
-no_auto_sda
-nothreshold

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

于 2010-05-12T11:24:48.800 回答
0

我有同样的问题,这也应该为你解决:

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

于 2017-11-02T11:02:30.367 回答