1

我想在 Eclipse 中使用 ndk r10d 从 Android 源代码构建 libunwind。但是我在编译 "Gresume.c" 时失败了,并且在 asm 代码中失败了。我无法理解asm代码,我搜索了任何地方都找不到有同样问题的人,所以我希望有人能帮助我。

代码的错误行是:

  asm __volatile__ (
"ldmia %0, {r4-r12, lr}\n"
"mov sp, r12\n"
"bx lr\n"
: : "r" (regs) ,
    "m" (*(struct regs_overlay *)regs)
  );

错误输出:

[armeabi] 编译拇指:MyBacktrace <= Gresume.c /var/folders/g7/9gd3cwy96z12qt3vlf7sc5q80000gn/T//cc6jsBSj.s:汇编程序消息:/var/folders/g7/9gd3cwy96z12qt3vlf7sc5q80000gn/T//cc6jsBSj.s:88:错误: lo 需要注册 -- `ldmia r2,{r4-r12,lr}' make: *** [obj/local/armeabi/objs/MyBacktrace/libunwind/src/arm/Gresume.o] 错误 1

完整的代码可以在下面的链接中找到。

4

2 回答 2

1

看来您正在构建 Thumb 代码,所以我猜您会看到这个,因为您的目标是错误的架构版本。传统上,大多数 Thumb 指令只能使用“低位寄存器” ——能够移动“高位寄存器”(即此处)r0-r7的 Thumb 版本直到 ARMv7 *才存在。据我所知,Android 的最低公分母仍然是 ARMv5,因此,如果您的目标是默认情况下,那么汇编程序将拒绝该指令集版本中不可能发生的事情。ldmiar8-r12, r14

将构建设置更改为目标 ARMv7,或仅构建为 ARM 代码而不是 Thumb,应将相关选项传递给汇编器,以便它可以找到适合该指令的编码。

* 从技术上讲是 ARMv6T2,但我很确定 ARM1156 在 Android 环境中不相关。

于 2015-11-30T12:17:13.630 回答
1

从这里开始的简短解决方案,将您的代码放在一个不同的 .s 文件中,并在开头:

.thumb
.syntax unified

但我仍然不明白为什么它会起作用......

于 2020-04-21T15:37:26.573 回答