Почему код gcc emmiting выровнен с границей 2 байта для набора команд ARM?

Я проверяю вывод ассемблера программы C, которую я компилирую для платформы Android ARM, используя GCC (версия, включенная в Android NDK).

Я указываю набор инструкций 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)

Может ли кто-нибудь определить, что я делаю неправильно, или знаю, как я могу обеспечить правильное выравнивание кода? Большое вам спасибо заранее!

Ответ 1

В соответствии с документацией ассемблера, псевдотерм .align задает мощность в два для архитектуры ARM. Следовательно, выравнивание равно 2 ^ 2 = 4 байта, что правильно.