【问题标题】:Why is gcc emmiting code aligned to a 2 byte boundary for the ARM instruction set?为什么 gcc 发射代码与 ARM 指令集的 2 字节边界对齐?
【发布时间】:2012-08-19 08:20:32
【问题描述】:

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

我指定的是长度为 4 字节而不是 THUMB 的 ARM 指令集,但令人惊讶的是,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)

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

【问题讨论】:

  • 作为记录,NDK 上 GCC 的默认模式是发出 ARM 和 Thumb 代码的混合。 Thumb 指令在 16 位边界上对齐。
  • 希望现代 GCC 将始终使用 .p2align,这无疑是 2 的幂,而不是依赖于目标的字节数或指数。

标签: android c gcc android-ndk arm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2011-08-24
    • 2023-03-25
    • 1970-01-01
    • 2013-05-18
    • 2019-04-10
    • 2012-04-30
    相关资源
    最近更新 更多