1

私は自分のデバイス用のネイティブ アーム android gcc/binutils のクロスビルドに取り組んでいます...特に KBOX で実行します (libfakechroot を使用して Android ターミナル アプリ内に標準の UNIX ファイルシステムを作成します)。gcc/binutils のいくつかのバージョンを正常に構成して作成しましたが、それらをデバイスに転送すると、次の 2 つのいずれかが発生します。

a) クロスビルドされたネイティブ コンパイラでコンパイルされたバイナリ (基本的には Hello World) は、セグメンテーション エラーをスローします。b) gcc および bintutils オプションを指定してクロスビルド ネイティブ コンパイラ ツールを実行すると、セグメンテーション フォールトがスローされます。

膨大な数の検索結果からさまざまな構成オプションを組み合わせて何時間も試しましたが、どれもうまくいきませんでした。私の次の攻撃計画は、(どういうわけか) gcc で Bionic を構築する方法を理解することです...しかし、誰かが以下の詳細で私が見逃した何かを見てくれることを願っています

詳細
クロス コンパイル ツールチェーン: API レベル 14 をターゲットとする make-standalone-toolchain.sh スクリプトを使用して Android NDK からビルドされた GCC 4.7.0
ネイティブ ツールチェーン: devtoolset リポジトリからの GCC 4.7.0
ビルド システム: CentOS 6.2
最新の binutils 構成オプション

sudo sh ../binutils-2.23/configure --build=x86_64-redhat-linux --host=arm-linux-eabi --
disable-option-checking --enable-ld --enable-languages=c --disable-gold --disable-fortran
--disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libada
--disable-werror --disable-multilib --with-build-time-tools=/project/arm-cc/bin
CC=arm-linux-androideabi-gcc CFLAGS='-Wall -O -mandroid -mbionic' 
LDFLAGS='-Wl,--entry=main,--dynamic-linker=/system/bin/linker -lc -lgcc' 
LIBCFLAGS='-O2 -mandroid -mbionic' LIBCPPFLAGS='-O2 -mandroid -mbionic' LIBCXXFLAGS='-O2 -mandroid -mbionic -fno-implicit-templates' 
LIBS='-lc -lgcc' 

スペースを節約するためにツールチェーンの変数を除外する

最新の GCC 構成オプション

./gcc-4.7/configure --build=x86_64-redhat-linux --host=arm-linux-eabi --disable-ld
--with-as=/opt/andv1b/usr/local/arm-linux-eabi/bin/as 
--with-ld=/opt/andv1b/usr/local/arm-linux-eabi/bin/ld 
--enable-version-specific-runtime-libs --enable-shared --enable-languages=c 
--disable-bootstrap -disable-gold --disable-fortran --disable-libssp 
--disable-libquadmath --disable-libquadmath-support --disable-libada --disable-werror 
--disable-multilib --disable-libgomp --disable-cloog 
--with-build-time-tools=/opt/centos/devtoolset-1.1/root/usr/bin 
CC=arm-linux-androideabi-gcc 
CFLAGS='-Wall -O -mandroid -mbionic' 
LDFLAGS='-Wl,--entry=main,--dynamic-linker=/system/bin/linker -lc -ldl -lgcc -lm' 
LIBCFLAGS='-O2 -mandroid -mbionic' LIBCPPFLAGS='-O2 -mandroid -mbionic' LIBCXXFLAGS='-O2 -mandroid -mbionic -fno-implicit-templates' LIBS='-lc -ldl -lgcc -lm -lsupc++ -lgnustl_shared'  

スペースを節約するためにツールチェーンの変数を除外します。

4

1 に答える 1

1

クロスネイティブに構築された GCC でのセグメンテーション違反は、-Wl,--entry=main の指定が原因でした。バイナリ segfault の原因は不明ですが、android (具体的には NookHD) 用の GCC をビルドし、segfault を起こさない単純な「hello world」をコンパイルすることができました。

重要なのは、binutils と gcc configure の両方で --host=arm-linux-eabi の 代わりに
--host=arm-linux-androideabiという構成オプションを指定することでした。これは、-mandroid および -mbionic フラグの使用に加えて、Android CRT (C ランタイム) ファイルの正しい名前を要求するように GCC をビルドしました... 別名 crtbegin_dynamic.o および crtend_android.o... crt0.o およびその他ではありませんglibc (または newlib?) CRT ファイル。


注意事項

  1. binutils と gcc configure の両方に --disable-option-checking オプションを使用する必要がある場合があります
  2. GCC の場合、 --host=arm-linux-androideabi は最上位の config.sub でサポートされていますが、gmp、mpc、または mpfr config.sub ファイルではサポートされていません (gmp または mpc の場合、config.sub は configfsf.sub です)。私が追加したため、最上位の config.sub でのみサポートされている可能性があります (正直なところ、それが変更の一部であったかどうかは忘れています)。gmp、mpfr、mpc の config.sub ファイルを手動で編集し、2 つの場所に linux-android* ターゲットを追加する必要があります。linux-gnu* を検索し、その直後に linux-android* エントリを配置します。
  3. C 以外のすべての言語と、このビルドで利用可能なオプションの多くを無効にしました。他の言語またはオプションが有効になっていると、これが機能しない可能性があります。
  4. Android NDK のドキュメントには、スタンドアローン ツールチェーン (NDK の make-standalone-toolchain.sh スクリプトで生成されたもの) を使用する場合、 --sysroot の使用はオプションであると記載されていますが、fixincluded が正しいヘッダーで実行します。
于 2013-10-22T02:02:57.477 に答える