GreenHills - 小数据区溢出

Gar*_*ary 4 embedded real-time linker-errors integrity greenhills

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

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

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

-auto_sda

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

Quu*_*one 5

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

这个错误通常是因为人谁为感知的链接器已经投入超过64K字节到SDA部分的连接之前,甚至得到一个机会,在它一展身手.如果你做了类似的话,那些不知情的人可能就是你

#pragma startsda
int small_data[10000];  // 40Kbytes
int small_data_also[10000];  // another 40Kbytes
#pragma endsda
Run Code Online (Sandbox Code Playgroud)

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

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

最后,即使你认为自己没有过世-sda=,也可能会感到惊讶.使用-#-v选项运行驱动程序.IIRC,默认ccintppc秘密通过-sda=4.你可以让司机停止"帮助"你; 只是传递-sda=none-sda=0,它应该覆盖驱动程序的默认值.您可能希望逐个文件地传递此选项,从最冷的代码开始.