2013-06-11 2 views
1

Есть ли простой способ определить символ для ассемблера toolchain для Android NDK из файла Android.mk?Определить символ для исходного файла сборки (.s) в Android.mk?

Моя цель - создать встроенную библиотеку, состоящую из нескольких файлов .C и .s (ассемблера), скомпилированных и настроенных для ARMV6 или ARMV7A EABIS со всей необходимой условной компиляцией, управляемой простым изменением APP_ABI в файле Application.mk.

Сначала я успешно использовал директивы ifeq(), доступные в Android.mk, чтобы запросить значение значения APP_ABI, а затем условно выполнить различные части скрипта сборки.

Затем я попытался использовать эту функцию, чтобы условно впрыснуть символ (через -D), например:

# Compilation Flags 
ifeq ($(TARGET_ARCH_ABI),armeabi) 
    LOCAL_CFLAGS += -DTARGET_ARMEABI -marm -mtune='arm1136jf-s' -ffast-math -O3 -march=armv6 -fvisibility=hidden 
else 
    #armeabi-v7a 
    LOCAL_CFLAGS += -marm -ffast-math -O3 -march=armv7-a -fvisibility=hidden 
endif 

Исходные файлы C код найти символ TARGET_ARMEABI правильно определен, однако ассемблер файлов нет. (Я требую этого, чтобы определить надлежащие атрибуты EABI в соответствии с архитектурой). Это пример того, как я пытаюсь условно определить EABI атрибуты в ассемблере файлов:

.ifdef TARGET_ARMEABI 
    .arch armv6 
    .fpu softvfp 
    .eabi_attribute 23, 1 
    .eabi_attribute 24, 1 
    .eabi_attribute 25, 1 
    .eabi_attribute 26, 2 
    .eabi_attribute 30, 2 
    .eabi_attribute 18, 4 
.else 
    .arch armv7-a 
    .eabi_attribute 27, 3 
    .fpu vfp 
    .eabi_attribute 23, 1 
    .eabi_attribute 24, 1 
    .eabi_attribute 25, 1 
    .eabi_attribute 26, 2 
    .eabi_attribute 30, 2 
    .eabi_attribute 18, 4 
.endif 

Любые указатели или предложения очень ценятся.

+0

Выполняется ли 'CFLAGS' для ассемблера? Может быть, есть соответствующие 'ASMFLAGS'? Можете ли вы показать полные командные строки, отправляемые соответственно вашему компилятору и ассемблеру? –

ответ

1

Файлы сборки должны заканчиваться капиталом S (.S или .sx), который должен быть предварительно обработан gcc. См. GCC doc, 3.2 Options Controlling the Kind of Output об этом.

Я считаю, вы можете обмануть от Bionicsources, например от libc/arch-arm/bionic/memcpy.S.

+0

Большое спасибо, я переименовал расширения в капитал S и заменил директивы '.ifdef' на' # ifdef', как было предложено @ bsa2000, и работает как ожидалось. Ура! = D –

1

Для того, чтобы определить TARGET_ARMEABI видны в файл сборки скомпилировать его с опцией «-x ассемблере с-CPP» и использовать стандартный C препроцессор #ifdef директивы в файле сборки.

Смежные вопросы