1

現在、pandaboard 用に Android Linaro ビルド 11.11 (staging-panda) をコンパイルしています。

ビルド プロセスでは、Android はホスト gcc コンパイラを使用していくつかのツールをコンパイルします。Linux Mint 12 (Ubuntu-11.10 ベース) では、デフォルトで gcc-4.6 がインストールされています。

私は Android を構築しました。すべて正常に動作し、pandaboard が起動しましたが、アプリケーションを起動すると、セグメンテーション エラーが発生します (logcat のシグナル 11)。

その後、Linaro がこのリリースを 4.6 バージョンではなく gcc-4.5 でビルドしたことを知りました。apt-get でインストールしました。out/ ディレクトリを削除し、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

リンカは gcc-4.5 の 64 ビット ライブラリを取得しますが、おそらく 32 ビット バージョン用です。これまでのところ、成功せずに試したことは次のとおりです。

  1. これらの指示に従ってパッケージのインストールをやり直してください
  2. sudo ldconfig
  3. マシンを再起動します
  4. gcc-4.6 を削除して、マシンで gcc-4.5 のみを取得することを検討しました。しかし、シナプスは非常に多くの依存関係をアンインストールする必要があることを示していたので、その手順を実行しませんでした:)

最後に、gcc-4.5-multilib と g++-4.5-multilib をインストールするように言われました。それは機能し、ビルドはさらに進みました。パンダを起動しても、アプリ (com.android.launcher など) が起動しません。これは仮定であることは承知していますが、この segfault は何らかの形でコンパイラに関連していると思います。

私の質問は簡単です:

  1. com.android.launcher はホスト 32 ビット コンパイラでクロスコンパイルまたはコンパイルされていますか? ビルド ログで関連するコマンドを見つけるには、どのキーワードを探す必要がありますか?
  2. このセグメンテーション違反をデバッグするにはどうすればよいですか? 特に、「am」コマンドで com.android.launcher を起動する方法を探しています。
  3. strace は、この問題に関する有益な情報を提供してくれますか?

ありがとうございます。

4

1 に答える 1

2

gdbを使用します。要件:

#はターゲットシェルですが、ルートであることは必須ではありません
$が、ホストシェルです

  1. アプリはデバッグモードでコンパイルする必要があります
    LOCAL_CFLAGS += -g
  2. ターゲットでgdbserverを起動します:(
    # gdbserver :5039 </system/bin/executable>
    または)
    # gdbserver :5039 --attach <pid>
  3. tcpポートをadb接続に転送します。
    $ adb forward tcp:5039 tcp:5039
  4. ホストでgdbclientを起動します。
    $ gdbclient :5039 <executable>

で苦労している場合は、関数が定義されている場所gdbclientを確認してください。詳細オプションを追加すると役立つ場合があります。また、実行可能ファイルがにない場合は、ハードコーディングされているため、必ず変更する必要があります。build/envsetup.sh
$ type gdbclient
-vsystem/binbuild/envsetup.sh

詳細については、こちらをご覧ください

于 2012-10-24T15:49:14.163 に答える