android - 为什么 gcc emmiting 代码与 ARM 指令集的 2 字节边界对齐?

标签 android c gcc android-ndk arm

我正在检查使用 GCC(Android NDK 中包含的版本)为 ARM Android 平台编译的 C 程序的汇编语言输出。

我正在指定长度为 4 字节的 ARM 指令集而不是 THUMB,但令人惊讶的是,emmited 汇编语言代码将函数对齐到 2 字节边界!

这是显示错误的 .align 指令的生成代码示例:

.Ltext0:
    .global __aeabi_dmul
    .global __aeabi_d2iz
    .section    .text.InitializeFIRFilter,"ax",%progbits
    .align  2
    .global InitializeFIRFilter
    .type   InitializeFIRFilter, %function
InitializeFIRFilter:
    .fnstart

根据 this document ,正确的对齐方式应该是 4,这是有道理的。

我试图通过使用 -falign-functions=4 来强制对齐,但它被忽略了。

这是我在 Android.mk 文件中指定的构建标志

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
    LOCAL_ARM_MODE  := arm
    LOCAL_MODULE    := nativeJadeMobile
    LOCAL_SRC_FILES := nativeJadeMobile.c fftasm.s
    LOCAL_LDLIBS    := -llog
    LOCAL_CFLAGS += -marm -ffast-math -O2 -march=armv6 -falign-functions=4 -save-temps -S 
    include $(BUILD_SHARED_LIBRARY)

任何人都可以发现我做错了什么,或者知道如何强制执行正确的代码对齐吗?非常感谢您!

最佳答案

根据assembler's documentation , .align 伪操作为 ARM 架构指定了 2 的幂。因此,对齐为2^2=4字节,是正确的。

关于android - 为什么 gcc emmiting 代码与 ARM 指令集的 2 字节边界对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12098044/

相关文章:

android - 命令调用失败 : Unity Remote requirements check failed

Android Studio 不显示构建变体

c - 如何将数组字符放入方程中?

gcc - 如何在 MinGW 中将错误消息控制设置为详细?

.c源文件和.so动态库一起编译

c++ - Open MP:SIMD循环中的SIMD兼容功能?

android - 为什么启动超过 2 个 AVD 仅在特定条件下有效

android - TLS - Node.js 服务器到 Android 应用程序

c - 内存对齐检查

c - GNU 内置函数有哪些?