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

标签 android gcc assembly android-ndk arm

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

我的目标是能够构建一个由多个 .C 和 .s(汇编程序)文件组成的本地库,这些文件针对 ARMV6 或 ARMV7A EABIS 进行了编译和调优,并通过简单地修改 APP_ABI 值来驱动所有必需的条件编译在 Application.mk 文件上。

首先,我成功地使用了 Android.mk 中可用的 ifeq() 指令来查询 APP_ABI 值的值,然后有条件地执行构建脚本的不同部分.

然后我尝试使用此功能来有条件地注入(inject)符号(通过 -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

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

最佳答案

汇编文件需要以大写S结尾(.S.sx)才能被gcc预处理。参见 GCC doc, 3.2 Options Controlling the Kind of Output关于那个。

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

关于android - 在 Android.mk 中为程序集 (.s) 源文件定义一个符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17034898/

相关文章:

Android 模拟器不显示应用程序 - 它只显示皮肤

Android ActionBar 后退按钮默认填充

java - 我用Android Studio导出jar时没有jar文件

c++ - 整数常量上的错误后缀 Ui64 无效

caching - 缓存如何被打败?

android - 需要 android.support.v4.app.fragment

c++ - 全新安装的子弹物理引擎无法正确链接?

c - 禁用 SSE 的 SSE 寄存器返回

macos - 无法将 .data 中的变量移动到 Mac x86 程序集的寄存器

assembly - 引导加载程序错误 : Help in assembly