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

11 c android gcc arm android-ndk

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

我指定的ARM指令集长度为4个字节而不是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
Run Code Online (Sandbox Code Playgroud)

根据这个文件,正确的对齐应该是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)
Run Code Online (Sandbox Code Playgroud)

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

ugh*_*fhw 16

根据汇编程序的文档,.align伪op为ARM体系结构指定了2的幂.因此,对齐是2 ^ 2 = 4个字节,这是正确的.