如何避免"重定位被截断以适应"来自.ARM.exidx?

时间:2017-01-26 17:59:21

标签: c gcc assembly arm relocation

我遇到的重定位被截断以适应我的嵌入式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))也没有解决问题,所以我怀疑它是内联汇编跳转的线路,但真正的问题是 - 如何解决这个问题?

0 个答案:

没有答案