GCC (Android NDK に含まれているバージョン) を使用して ARM Android プラットフォーム用にコンパイルしている C プログラムのアセンブリ言語出力を調べています。
THUMB ではなく 4 バイト長の ARM 命令セットを指定していますが、驚くべきことに、発行されたアセンブリ言語コードは関数を 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)
誰かが私が間違っていることを見つけたり、正しいコードの配置を強制する方法を知ったりできますか? 事前にどうもありがとうございました!