Ошибка: требуется регистрация при сборке libunwind в Android ndk
Я хочу собрать libunwind из Android-источника в eclipse, используя ndk r10d. Но мне не удается скомпилировать "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/9gd3cwy96z12qtj.s00006j00006x6x7: требуется регистрация - `ldmia r2,{r4-r12,lr}'делает: *** [obj/local/armeabi/objs/MyBacktrace/libunwind/src/arm/Gresume.o] Ошибка 1
полный код можно найти по ссылке ниже.
1 ответ
Кажется, вы создаете Thumb-код, поэтому я предполагаю, что вы видите это, потому что нацелены не на ту версию архитектуры. Традиционно большинство инструкций Thumb могут использовать только "низкие регистры" r0-r7
- Thumb версия ldmia
способен перемещать "высокие регистры" (т.е. r8-r12, r14
здесь) не существовало до ARMv7*. Насколько я знаю, наименьшим общим знаменателем для Android по-прежнему является ARMv5, поэтому, если вы нацеливаетесь на него по умолчанию, ассемблер собирается отказаться от вещей, которые невозможны в этой версии набора команд.
Изменение настроек вашей сборки на целевой ARMv7 или просто на сборку в виде кода ARM вместо Thumb должно передать соответствующие параметры ассемблеру, чтобы он мог найти подходящую кодировку для этой инструкции.
* Технически ARMv6T2, но я уверен, что ARM1156 не имеет отношения к контексту Android.
Краткое решение отсюда, поместите свой код в отдельный файл.s с этим в начале:
.thumb
.syntax unified
Но я до сих пор не понимаю, почему это работает...