1

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

我的目标是能够构建一个由多个 .C 和 .s(汇编程序)文件组成的本机库,这些文件针对 ARMV6 或 ARMV7A EABIS 进行编译和调整,只需修改应用程序上的 APP_ABI 值即可驱动所有必需的条件编译.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

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

4

2 回答 2

1

汇编文件需要以大写字母 S(.S.sx)结尾,以进行预处理gcc。请参阅GCC 文档,3.2 控制输出类型的选项

我相信您可以从Bionic 源代码中作弊,例如从libc/arch-arm/bionic/memcpy.S中作弊。

于 2013-06-11T06:36:56.450 回答
1

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

于 2013-06-11T11:16:22.863 回答