Ошибка: требуется регистрация при сборке 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

Но я до сих пор не понимаю, почему это работает...

Другие вопросы по тегам