Embedded GreenHills-小数据区溢出
我希望有人能快速回答这个问题,但本质上,当我打开优化时,会出现以下错误: [elxr](错误)小数据区 溢出:0xfff9f6fc(已签名)没有溢出 在执行时放入16位 文件test_main.o中的重新定位 在位置uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 当我输入此链接器指令时,也会发生类似错误: -自动驾驶Embedded GreenHills-小数据区溢出,embedded,real-time,linker-errors,integrity,greenhills,Embedded,Real Time,Linker Errors,Integrity,Greenhills,我希望有人能快速回答这个问题,但本质上,当我打开优化时,会出现以下错误: [elxr](错误)小数据区 溢出:0xfff9f6fc(已签名)没有溢出 在执行时放入16位 文件test_main.o中的重新定位 在位置uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 当我输入此链接器指令时,也会发生类似错误: -自动驾驶 他们的手册没有提到这个链接器错误
他们的手册没有提到这个链接器错误。我正在使用Integrity 5.10在做了一些研究之后,链接所有不使用SDA选项的库可能会有这种冲突。由于我无法控制这些库的构建方式,目前我已将以下标志应用于我的GPJ,似乎解决了这个问题:
-Onolink
-no_auto_sda
-nothreshold
请注意,这些选项禁用所有链接器优化并完全禁用SDA选项。此链接器错误通常与-Olink
优化-auto\u SDA
无关。链接器会看到您的整个程序,并会尝试通过自动发送超过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个单独的文件中分别对10000字节进行SDA,然后链接器会抱怨您正在处理200000字节的SDA。(链接器足够聪明,可以将常规数据引用重写为SDA引用,但从未教过如何以相反方向重写。)
最后,即使您认为自己没有通过
-sda=
,您也可能会感到惊讶。使用-#
或-v
选项运行驱动程序。IIRC,ccintppc
默认情况下秘密传递-sda=4
。你可以让司机停止“帮助”你;只需通过-sda=none
或-sda=0
,即可覆盖驾驶员的默认设置。您可能希望以文件为基础传递此选项,从您的开始。我也有同样的问题,这也应该为您解决:
编译器选项
-large_sda
将允许23位sda重定位,而不是16位。然后你也应该能够毫无问题地使用-sda=all
。顺便说一句,我遇到的唯一一件事是提到使用sda构建的库与未使用sda构建的库之间可能存在某种不兼容。注意,起初,我不接受这个答案,因为它不是最好的,我欢迎任何仍然允许优化的改进想法。我想我已经发布了真正的答案,尽管我知道已经晚了两年。;)我不能确认它=),我换了工作,但它的根本原因听起来比我的高级修复更详细。@Quuxplusone我已禁用SDA,但它没有解决问题。我不是从命令行使用GHS Multi IDE。你知道如何使用-v选项吗。Thanks@Frankenstein:如果您的错误消息与Gary的有任何不同,请在此处发布新问题并通过评论链接到该问题。如果您收到的错误消息是完全相同的(一直到对oe\u init\u intconn
的引用),那么(a)我不相信您,并且(b)您只需将-v
添加到编译器选项中,就够了。@quoxplusone ready done=D不完全相同的错误消息。但我也在使用GHS Multi-wich,它是一个GUI界面,不是来自命令行