为什么gcc在ARM指令集中会发出按2字节边界对齐的代码?

12

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

我指定了ARM指令集,这些指令集长度为4个字节而不是THUMB,但令人惊讶的是,生成的汇编代码将函数对齐到2个字节的边界!

以下是生成的代码示例,显示了错误的.align指令:

.Ltext0:
    .global __aeabi_dmul
    .global __aeabi_d2iz
    .section    .text.InitializeFIRFilter,"ax",%progbits
    .align  2
    .global InitializeFIRFilter
    .type   InitializeFIRFilter, %function
InitializeFIRFilter:
    .fnstart
根据这个文档,正确的对齐方式应该是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)

有谁能发现我做错了什么,或者知道如何强制执行正确的代码对齐?非常感谢您的帮助!


值得一提的是,NDK上GCC的默认模式是发出ARM和Thumb代码的混合体。Thumb指令在16位边界上对齐。 - Seva Alekseyev
希望现代GCC始终使用.p2align,这是一个明确的2的幂,而不是依赖于目标的字节计数或指数。 - Peter Cordes
1个回答

17
根据汇编器的文档,.align 伪操作符指定了 ARM 架构的二次幂对齐方式。因此,对齐方式为 2^2=4 字节,这是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接