ARM ターゲット用に Mac OS X で newlib とともに GCC をコンパイルしました。ただし、libc.a は -fshort-enums でコンパイルされています。ARM 用にコンパイルするときは、-fno-short-enums を使用するため、これは望ましくありません。もちろん、これは矛盾します:
ld: warning: /var/folders/9m/2wnjp9zd71x13cpdpf16y_4r0000gn/T//ccQuEnp6.o uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail
「Hello, World!」を実行しようとするたびに 実行可能、セグメンテーション違反。これが理由でしょうか?
hello.c をコンパイルするために使用したコマンドは次のとおりです。
arm-eabi-gcc \
hello.c -o hello \
/Users/user/gcc-arm-install/arm-eabi/lib/crt0.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtbegin.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crti.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtn.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtend.o \
-v -nostdinc -nostdlib -static \
-march=armv7-a -mno-thumb-interwork -marm -mfpu=neon -mfloat-abi=softfp -fpic \
-ffunction-sections -fno-short-enums -fno-rtti -fno-exceptions \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include-fixed \
-I/Users/user/gcc-arm-install/arm-eabi/include \
-I/Users/user/gcc-arm-install/arm-eabi/sys-include \
-L/Users/user/gcc-arm-install/arm-eabi/lib \
-L/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0 \
-lm -lc -lgcc
アップデート:
わかりました、問題を newlib の libc とスタートアップ ファイル (crt0.o) の組み合わせに絞り込んだと思います。Android NDK の libc.a とスタートアップ ファイルを使用して GCC 4.7.0 でテスト アプリをコンパイルしようとしましたが、静的にコンパイルすると電話で動作しました。実際、「可変サイズの列挙型」を使用している libgcc について ld が再び不満を述べていた (つまり、他のすべてのように -fno-short-enums でコンパイルされていない) にもかかわらず、それは機能しました。したがって、 -fno-short-enums が以前のクラッシュしたバイナリの原因であるという私の仮説は正しくありませんでした。
機能しているものは次のとおりです。
ターゲット「arm-linux-eabi」のソースからコンパイルされた Binutils および GCC 4.7.0。--with-newlib (GCC のソース ツリーの newlib と libgloss) を使用して GCC を構成しました。したがって、GCC は実際には newlib でビルドされ、newlib とともにインストールされ、newlib の libc と実際にリンクしない限り、動作するバイナリを生成します。現時点では、代わりに Andoid NDK とそのスタートアップ ファイルの libc を使用する必要があります。
私のコンパイルスクリプトは次のようになります。インクルードとライブラリのパスは、NDK のインクルードと libc を指しています。
NDK_PATH="/Users/user/SOURCE/android-ndk-r8/platforms/android-9/arch-arm"
CFLAGS="-nostdinc -nostdlib -static -fno-short-enums -lc -lgcc -lc"
gcc $NDK_PATH/usr/lib/crtbegin_static.o \
hello.c -o hello $CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o
newlib の libc が動作する状態でバイナリを静的にコンパイルしたいのです。シェルスクリプトに戻る...