【问题标题】:Cross Built Native Compiler Issues: Segfaults in Compiler or Compiled Binary交叉构建的本机编译器问题:编译器或编译后的二进制文件中的段错误
【发布时间】:2013-10-29 06:33:32
【问题描述】:

我正在为我的设备交叉构建本机 arm android gcc/binutils...特别是在 KBOX 中运行(它使用 libfakechroot 在 Android 终端应用程序中创建标准 UNIX 文件系统)。我已经成功配置并制作了多个版本的 gcc/binutils,但是当我将它们传输到设备时,会发生以下两种情况之一:

a) 使用交叉构建的本机编译器编译的二进制文件(基本上是 hello world)会引发分段错误。 b) 使用任何选项执行任何交叉构建的本机编译器工具...gcc 和 bintutils...会引发分段错误。

我花了几个小时尝试从大量搜索结果中拼凑出不同的配置选项,但都没有奏效。我的下一个攻击计划是(以某种方式)弄清楚如何使用 gcc 构建 Bionic ......但我希望有人会在下面的细节中看到我错过的东西

详细信息
交叉编译工具链:使用 make-standalone-toolchain.sh 脚本从 Android NDK 构建的 GCC 4.7.0,针对 API 级别 14本机工具链:来自 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'  

为工具链省去变量以节省空间。

【问题讨论】:

    标签: android c gcc android-ndk cross-compiling


    【解决方案1】:

    跨原生构建的 GCC 的段错误是由于指定 -Wl,--entry=main。不确定是什么导致了二进制段错误,但我能够为 android(特别是 NookHD)构建 GCC 并编译一个没有段错误的简单“hello world”。

    关键是要指定以下配置选项:
    --host=arm-linux-androideabi
    而不是:
    --host=arm-linux-eabi
    对于 binutils 和 gcc 配置。这除了使用 -mandroid 和 -mbionic 标志外,还构建了 GCC 以请求 Android CRT(C 运行时)文件的正确名称...又名 crtbegin_dynamic.o 和 crtend_android.o...不是 crt0.o 和其他glibc(或 newlib?)CRT 文件。

    注意事项

    1. 可能需要对 binutils 和 gcc 配置使用 --disable-option-checking 选项
    2. 对于 GCC,顶级 config.sub 支持 --host=arm-linux-androideabi,但在 gmp、mpc 或 mpfr config.sub 文件中不支持(对于 gmp 或 mpc,config.sub 为 configfsf。 sub)并且它可能仅在顶级 config.sub 中受支持,因为我添加了它(老实说,我忘记了它是否是更改的一部分)。您必须手动编辑 gmp、mpfr 和 mpc 的 config.sub 文件,并在两个位置添加 linux-android* 目标;搜索 linux-gnu* 并将 linux-android* 条目直接放在其后面。
    3. 我禁用了除 C 之外的所有语言,以及此版本的许多可用选项;如果启用了其他语言或选项,这可能不起作用。
    4. 尽管 Android NDK 文档指出在使用独立工具链(使用 NDK 中的 make-standalone-toolchain.sh 脚本生成)时使用 --sysroot 是可选的,但我必须使用 --with-sysroot 以便fixincludes 将在正确的标头上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多