我遇到的重定位被截断以适应我的嵌入式ARM应用程序的错误,该应用程序已编译并与GCC 4.9.3链接。我正在使用从外部闪存(0x70000000)
到内部RAM (0x08000000)
的此函数的代码重定位来提高我的应用程序的性能,这是问题的原因之一。
我有一个小的内联汇编裸函数来执行短循环:
void ThreeCycleDelay(uint32_t count) __attribute__((naked))
{
__asm(" subs r0, #1\n"
" bne ThreeCycleDelay\n"
" bx lr");
}
但是在链接时,我从ld收到以下错误:
d:/app/app.a(app_utils.obj):( ARM.exidx.text.ThreeCycleDelay +为0x0): 重定位被截断以适合:R_ARM_PREL31反对 `.text.ThreeCycleDelay'
我在互联网上看到了解决这个问题的建议,但没有一个是有用的。试图"删除" -funwind-tables -fno-exceptions
的.ARM.exidx部分没有任何区别。
当我不执行代码重定位时,错误消失,并且它不显示任何其他功能。删除__attribute__((naked))
也没有解决问题,所以我怀疑它是内联汇编跳转的线路,但真正的问题是 - 如何解决这个问题?