Как вызвать сборку руки из исходных файлов C?

Я нашел несколько хороших руководств по компиляции ассемблерного кода с помощью Android NDK. Но у них нет информации о том, как вызвать инструкции по сборке из исходных файлов C, что, я считаю, возможно. Кажется, я видел подобные уроки в Интернете. Мой вопрос в том, могу ли я получить исходный файл C, который вызывает вызовы сборки. Я также хочу иметь возможность компилировать с помощью NDK. Но мне нравится избегать использования Android Studio и JNI; одна из причин в том, что у меня нет кода Java. И я уже подтвердил, что могу компилировать и запускать исходные файлы C с помощью NDK. Итак, в основном я знаю, как компилировать исходные файлы C и файлы сборки с помощью NDK. Я подтвердил, что код C отлично работает на моем телефоне. Но я не уверен, как вызвать инструкции по сборке из исходных файлов C для архитектуры руки. Я продолжаю получать следующее сообщение об ошибке, когда пытаюсь скомпилировать простой исходный файл:

/tmp/ccwua4Gd.s: Assembler messages:
/tmp/ccwua4Gd.s:18: Error: selected processor does not support Thumb mode `smc #0'

Вот файл:

#include <stdio.h>

__asm__(" smc #0");

int main(void)
{
  /*Do something*/
  return 0;
}

Между прочим, проблема, похоже, не связана с большим пальцем и рукой. Я попробовал оператор LOCAL_ARM_MODE := arm в своем Android.mk, но это ничего не исправило. Я просто получаю аналогичную ошибку для инструкции ARM.

Обновление: я все еще получаю эту ошибку. Вот копия моего Android.mk. Мне не нужно было указывать версию руки или спецификацию руки/большого пальца в более раннем исходном файле C для выполнения на устройстве. Я читал о thumb, плюсах и минусах, связанных с этой опцией, и о том, как указать ее поддержку. Однако эта ошибка сохраняется, даже когда я настроил ABI. Единственное, что я не пробовал, — это добавлять расширение .arm к моим исходным файлам C. Я видел ссылку на него в предыдущем посте и не мог понять, почему это имеет значение. Я считаю, что ОП в этой ветке подразумевал, что это исправит ошибку. Кто-нибудь может уточнить это? Кто-нибудь использовал его? Каков эффект от этого по сравнению с операторами Android.mk, относящимися к архитектуре? Спасибо

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) 
LOCAL_MODULE := hello  
APP_ABI := armeabi-v7a
FILE_LIST := $(wildcard $(LOCAL_PATH)/*.c)
$(warning here is what is in FILE_LIST after an attempt to collect all the C files$(FILE_LIST))
FILE_LIST += $(wildcard $(LOCAL_PATH)/*.s)
$(warning here is what is in FILE_LIST after an attempt to collect all the S files$(FILE_LIST))
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
include $(BUILD_EXECUTABLE)

Еще одно обновление: я попытался добавить суффикс .arm к своим исходным файлам C, заменив foo.c на foo.c.arm, но даже это не решило проблему. Любая помощь приветствуется. Вот что я сейчас делаю в своем файле Android.mk:

FILE_LIST := $(patsubst %.c,%.c.arm,$(wildcard $(LOCAL_PATH)/*.c))

Вот обновленная версия ошибки. Он просто меняет слово «большой палец» на «рука».

/tmp/ccTK9siq.s: Assembler messages:
/tmp/ccTK9siq.s:17: Error: selected processor does not support ARM mode `smc #0'

Эй, я провел небольшое исследование и нашел это ссылка о моей проблеме. Я обновил свой файл Android.mk с помощью LOCAL_CFLAGS := -mcpu=cortex-a8, как указано на странице. Проблема не исчезла, но я получил информативное сообщение о том, что: warning: switch -mcpu=cortex-a8 conflicts with -march=armv5te switch [enabled by default] Итак, предложенные ниже команды толком не подействовали. Кто-нибудь знает, должен ли я попытаться изменить настройки ndk-build по умолчанию и как? В конце концов, это предупреждение; не ошибка. Поэтому я не уверен, потребовалась ли моя конфигурация или мне нужно сделать что-то еще. Также теперь я получаю сообщение об отсутствии единственного заголовочного файла stdio.h, которого раньше не было. Это говорит мне о том, что ndk-build только что передал процесс сборки после этого предупреждения. Может ли кто-нибудь дать руководство или решение для этого?

Обновление 073015 - я понял, что есть разница между application.mk и Android.mk. После настройки applicaiton.mk с указанными параметрами мне удалось изменить архитектуру на armv7-a, но я получаю ту же ошибку; Смотри ниже:

jni/Android.mk:6: This is in NDK_ROOT /home/sansari/android/android-ndk-r10d
[armeabi-v7a] Assembly       : hello_tz <= main_normal.filtered.s
./obj/local/armeabi-v7a/objs-debug/hello_tz/main_normal.filtered.s: Assembler messages:
./obj/local/armeabi-v7a/objs-debug/hello_tz/main_normal.filtered.s:16: Error: **selected processor does not support ARM mode `smc #0'**
make: *** [obj/local/armeabi-v7a/objs-debug/hello_tz/main_normal.o] Error 1

Есть ли какая-либо другая конфигурация, которую мне нужно сделать, чтобы получить желаемую функциональность?


person user3326293    schedule 22.07.2015    source источник
comment
из infocenter.arm.com/help/topic/com .arm.doc.dui0489c/ ›Раздел «Архитектуры SMC» Эта инструкция ARM доступна в реализациях ARMv6 и выше, если они имеют расширения безопасности. Эта 32-битная инструкция Thumb доступна в реализациях ARMv6T2 и выше, если они имеют расширения безопасности. 16-битной версии этой инструкции для Thumb нет.   -  person Toris    schedule 22.07.2015
comment
Я прочитал спецификацию руки инструкции SMC. Помимо того, что Ларри упомянул ниже, и того, что у меня есть, нужно ли мне делать что-то другое в моем исходном коде C или Android.mk?   -  person user3326293    schedule 23.07.2015
comment
Toris- Пожалуйста, посмотрите мое последнее обновление. Даже armeabiv7a не поддерживает вызов smc.   -  person user3326293    schedule 30.07.2015


Ответы (1)


Проблема в том, что вы внедряете сборку для ARMv6 или выше. Если вы не укажете ABI в своем NDK Application.mk, инструменты предполагают ARMv5.

person Larry Schiefer    schedule 22.07.2015