簡體   English   中英

錯誤:在 android ndk 中構建 libunwind 時需要注冊

[英]Error: lo register required when build libunwind in android ndk

我想在 Eclipse 中使用 ndk r10d 從 Android 源代碼構建 libunwind。 但是我在編譯 "Gresume.c" 時失敗了,它在 asm code 上也失敗了。 我看不懂匯編代碼,我搜索了任何地方都找不到有同樣問題的人,所以我希望有人能幫助我。

錯誤代碼行是:

  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/9gd3cwy96js0fj0s0cc:/var/folders/g7/9gd3cwy96z12qt3vlf7sc5q80000gn/T//cc6jsBSj.s : 需要注冊 -- `ldmia r2,{r4-r12,lr}' make: *** [obj/local/armeabi/objs/MyBacktrace/libunwind/src/arm/Gresume.o] 錯誤 1

完整代碼可以在下面的鏈接中找到。

您似乎正在構建 Thumb 代碼,所以我猜您看到這一點是因為您針對的是錯誤的架構版本。 傳統上,大多數 Thumb 指令只能使用“低寄存器” r0-r7 - 能夠移動“高寄存器”(即r8-r12, r14此處)的ldmia的 Thumb 版本直到 ARMv7 *才存在。 據我所知,Android 的最低公分母仍然是 ARMv5,所以如果你默認針對它,那么匯編器將拒絕在該指令集版本中不可能的事情。

將您的構建設置更改為目標 ARMv7,或者只是構建為 ARM 代碼而不是 Thumb,應該將相關選項傳遞給匯編程序,以便它可以為該指令找到合適的編碼。

* 技術上是 ARMv6T2,但我很確定 ARM1156 與 Android 上下文無關。

這里開始的簡短解決方案,將您的代碼放在一個不同的 .s 文件中,開頭是:

.thumb
.syntax unified

但我仍然不明白為什么它有效......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM