我有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"
);