31

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 が動作する状態でバイナリを静的にコンパイルしたいのです。シェルスクリプトに戻る...

4

2 に答える 2

2

仕事では、Cortex-M3 プラットフォーム用のクロスビルドを行い、newlib も使用しています。次のリンクが役立つ場合があります。

http://frank.harvard.edu/~coldwell/toolchain/ http://www.microbuilder.eu/Tutorials/SoftwareDevelopment/BuildingGCCToolchain.aspx

次のリンクは Cortex-M3 に固有のものですが、参考になるかもしれません。ツールチェーン ビルドのスクリプトを作成するために使用しました: http://www.johannes-bauer.com/mcus/cortex/?menuid=5

newlib が誤ってコンパイルされている可能性があります (おそらくホスト コンパイラで? リンクしているので可能性は低いですが、可能性はあります)。

于 2012-08-12T01:42:02.093 に答える
1

gcc または arm-gcc で作業するように、最初に作業環境を選択するシェル スクリプトを作成できると思います。このスクリプトでは、必要な別の lib への代替 lib リンクを作成できます。たとえば、ログインして gcc を選択した場合、lib ファイルは通常の libc になり、arm-gcc を選択した場合、lib は別のものになります。

于 2012-08-16T07:03:18.550 に答える