11

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)

誰かが私が間違っていることを見つけたり、正しいコードの配置を強制する方法を知ったりできますか? 事前にどうもありがとうございました!

4

1 に答える 1

16

アセンブラのドキュメントによると、.align疑似演算は ARM アーキテクチャに対して 2 のべき乗を指定します。したがって、アラインメントは 2^2=4 バイトであり、これは正しいです。

于 2012-08-23T18:49:23.337 に答える