私は現在、pandaboardのAndroid Linaroビルド11.11(ステージング - パンダ)をコンパイルしています。アプリの分割エラーをデバッグしますか?コンパイラの不具合?
ビルドプロセスでは、Androidはいくつかのツールをホストgccコンパイラでコンパイルします。私のLinux Mint 12(Ubuntu-11.10ベース)では、デフォルトでgcc-4.6がインストールされています。
私はAndroidを作りましたが、すべてがうまく動作し、pandaboardが起動しましたが、アプリケーションを起動するとセグメント違反(logcatのシグナル11)につながります。
私は、リナロが4.6バージョンではなくgcc-4.5でこのリリースを構築したことを知りました。私はapt-getを使ってインストールしました。私は/ディレクトリを削除し、Androidを完全に再構築しました。
コンパイルは正常に動作しますが、リンカが私を侮辱:
g++-4.5 -Wl,-rpath-link=out/target/product/pandaboard/obj/lib -Wl,-rpath,\$ORIGIN/../lib -Lout/host/linux-x86/obj/lib -Wl,--no-undefined -m32 out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o -Wl,--whole-archive -Wl,--no-whole-archive out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a -o out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp
g++-4.5 -Wl,-rpath-link=out/target/product/pandaboard/obj/lib -Wl,-rpath,\$ORIGIN/../lib -Lout/host/linux-x86/obj/lib -Wl,--no-undefined -m32 out/host/linux-x86/obj/EXECUTABLES/mkbootfs_intermediates/mkbootfs.o -Wl,--whole-archive -Wl,--no-whole-archive -o out/host/linux-x86/obj/EXECUTABLES/mkbootfs_intermediates/mkbootfs
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.5.4/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.5.4/libstdc++.a when searching for -lstdc++
/usr/bin/ld: cannot find -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.5.4/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.5.4/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
collect2: ld returned 1 exit status
リンカは32bit版のため、おそらくそれが、GCC-4.5の64ビットライブラリをつかみます。これまでのところ、ここで私が試した事が成功せず、以下のとおりです。
- 再実行し、次のパッケージのインストールをthese instructions
- はsudo ldconfigを 私のマシンは
- 私はGCC-4.6を取得するために削除するに見えた
- リブート私のマシンではgcc-4.5のみです。 4.5-multilibの - しかし、シナプスは、私はそのステップをしなかったアンインストールするために必要な非常に多くの依存関係、 :)
は、最後に私は、GCC-4.5-multilibのとg ++をインストールすると言われてきた示しました。それは働き、ビルドはさらに進んだ。私はパンダを始めるが、まだアプリケーション(例えばcom.android.launcher)は起動に失敗する。私はこれが前提だと知っていますが、私はこのセグメンテーションが何とかコンパイラにリンクされていると思います。
私の質問は単純です:
- は、クロスコンパイルまたはホスト32ビット コンパイラでコンパイルcom.android.launcherですか?ビルドログに関連するコマンドを見つけるためにどのようなキーワードを探す必要がありますか?
- このセグメンテーションフォルトをどのようにデバッグできますか?特に、私は "am"コマンドでcom.android.launcherを起動するために を探しています。
- straceはこの問題の重要な情報を提供しますか?
ありがとうございました。
* tl; dr *しかし、いくつかのクイックヘルプ: 'strace'は、物事がどんな点でクラッシュするかを大まかに示すかもしれません。 'gdb'ははるかに正確な表示を与えることができますが、あなたは' 'gdb''を稼働させること、' '-ggdb''を使ってクラッシュするバイナリ(またはライブラリ?)を構築すること、' 'gdb'を使う方法。 – mvds
私はstraceを数回使用しましたが、segfaultに役立つかどうか覚えていません。 gdbはアンドロイドで始めるのはかなり簡単です。私は数ヶ月前に(ARMでは非アンドロイドのLinux上で)徹底的に使っていましたが、私が追跡していたバグはsegfaultsではありません:)。だから今私は十字路の前にいる...私は-gを知っていたが、-ggdbについては知らなかった、ありがとう! –