1

我目前正在为 pandaboard 编译 Android Linaro build 11.11 (staging-panda)。

在构建过程中,Android 会使用宿主 gcc 编译器编译一些工具。在我的 Linux Mint 12(基于 Ubuntu-11.10)上,我默认安装了 gcc-4.6。

我构建了 Android,一切运行良好,pandaboard 已启动,但随后启动任何应用程序都会导致分段错误(logcat 中的信号 11)。

然后我了解到 Linaro 使用 gcc-4.5 构建了这个版本,而不是 4.6 版本。我使用 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. 须藤 ldconfig
  3. 重新启动我的机器
  4. 我考虑删除 gcc-4.6 以在我的机器上只获得 gcc-4.5。但是突触显示需要卸载太多依赖项,所以我没有做这一步 :)

最后我被告知要安装 gcc-4.5-multilib 和 g++-4.5-multilib。它奏效了,并且构建更进一步。我启动了熊猫,但应用程序(例如 com.android.launcher)仍然无法启动。我知道这是一个假设,但我认为这个段错误与编译器有某种联系。

我的问题很简单:

  1. com.android.launcher 是交叉编译还是使用主机 32 位编译器编译?我应该寻找什么关键字来在构建日志中找到相关的命令?
  2. 如何调试此分段错误?特别是,我正在寻找使用“am”命令启动 com.android.launcher。
  3. strace 会为此问题提供有价值的信息吗?

多谢了。

4

1 回答 1

2

使用gdb。要求:

#是目标 shell,虽然不是必须的 root 是
$主机 shell

  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
添加详细-v选项可能会有所帮助。此外,如果您的可执行文件不在 中system/bin,您肯定需要修改build/envsetup.sh它,因为它是硬编码的。

可以在此处找到更多信息。

于 2012-10-24T15:49:14.163 回答