1

我正在为我的设备交叉构建本机 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' 

为工具链省略 var 以节省空间

最新的 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'  

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

4

1 回答 1

1

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

关键是为binutils 和 gcc 配置指定以下配置选项:--
host=arm-linux-androideabi
而不是:--
host=arm-linux-eabi 。
除了使用 -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 以便修复包含在正确的标题上运行。
于 2013-10-22T02:02:57.477 回答