Clang + iOS + 汇编程序跳转:错误"unsupported relocation on symbol"



我有ARM32的汇编代码,在Android上它编译得很好,但在iOS上,它在跳转指令上抛出错误"符号上不支持重新定位"。对于Android64和iOS64,情况相同。

clang -target armv7m-none-ios-gnueabi "test.c"
void func()
{
__asm__ volatile
(
"eor r0, 0 nt" 
"cmp r0, 0 nt"
"beq .done nt" /*!!!*/
"eor r0, 0 nt"
".done: nt"
"bx lr nt"
);
}

同时,Godbolt没有出现任何问题https://godbolt.org/z/lr2bsZ.我使用Clang编译器8.0.0。

标签需要是本地的,即以大写的L开头。请注意,这与ELF目标不同,ELF目标的本地标签以.L开头。

这段代码对我来说编译得很好:

void func()
{
__asm__ volatile
(
"eor r0, 0 nt" 
"cmp r0, 0 nt"
"beq Ldone nt" /*!!!*/
"eor r0, 0 nt"
"Ldone: nt"
"bx lr nt"
);
}

不过,附带说明一下,您可能希望按照以下方式完全用汇编编写函数,因为据我所知,无法保证编译器不会在汇编之前或之后插入破坏您假设的代码。所以我建议这样做:

__asm__
(
"_func: n"
"eor r0, 0 n" 
"cmp r0, 0 n"
"beq Ldone n"
"eor r0, 0 n"
"Ldone: n"
"bx lr n"
);

相关内容

最新更新