在Android.mk中为程序集(.s)源文件定义符号?

时间:2013-06-11 00:33:53

标签: android gcc assembly android-ndk arm

是否有一种简单的方法可以从Android.mk文件为Android NDK工具链的汇编程序定义符号?

我的目标是能够构建一个由几个.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

非常感谢任何指针或建议。

2 个答案:

答案 0 :(得分:1)

汇编文件需要以.S预处理的大写字母S(.sxgcc)结束。请参阅GCC doc, 3.2 Options Controlling the Kind of Output

我相信你可以从Bionic sources作弊,例如从libc/arch-arm/bionic/memcpy.S作弊。

答案 1 :(得分:1)

要使TARGET_ARMEABI定义在程序集文件中可见,请使用' -x assembler-with-cpp '选项对其进行编译,并在程序集文件中使用标准C预处理程序 #ifdef 指令。