Я проверяю вывод ассемблера программы 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)
Может ли кто-нибудь определить, что я делаю неправильно, или знаю, как я могу обеспечить правильное выравнивание кода? Большое вам спасибо заранее!