【发布时间】:2012-05-02 22:37:13
【问题描述】:
我目前正在为 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 位版本。到目前为止,这是我尝试过的事情,但没有成功:
- 按照these instructions重新安装包
- sudo ldconfig
- 重启我的机器
- 我考虑删除 gcc-4.6 以便在我的机器上只获得 gcc-4.5。 但是突触显示需要卸载很多依赖项, 我没有迈出那一步:)
最后有人告诉我安装 gcc-4.5-multilib 和 g++-4.5-multilib。它奏效了,并且构建更进一步。我启动了熊猫,但应用程序(例如 com.android.launcher)仍然无法启动。我知道这是一个假设,但我认为这个段错误与编译器有关。
我的问题很简单:
- com.android.launcher 是交叉编译还是与host 32bit 一起编译 编译器?我应该寻找什么关键字来在构建日志中找到相关的命令?
- 如何调试此分段错误?特别是,我正在寻找 用于使用“am”命令启动 com.android.launcher。
- strace 会为此问题提供有价值的信息吗?
谢谢大家。
【问题讨论】:
-
tl;dr 但一些快速帮助:
strace可能会给您一个粗略的指示,告诉您什么时候崩溃。gdb可以给出更精确的指示,但您需要:1) 有一个工作的gdb,2) 使用-ggdb构建崩溃的二进制文件(或库?),3) 知道如何使用gdb。 -
我使用了几次 strace,但不记得它是否可以帮助解决段错误。 gdb 在 android 上很容易启动,几个月前我彻底使用了它(在 ARM 上的非 android linux 上),但我追逐的 bug 不是 segfaults :)。所以我现在就在十字路口前……我知道-g但不知道-ggdb,谢谢!
标签: android gcc segmentation-fault