交叉构建的本机编译器问题:编译器或编译二进制文件中的段错误

时间:2013-10-20 21:35:07

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

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

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

1 个答案:

答案 0 :(得分:1)

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

关键是要指定以下配置选项:
主机=臂-Linux的androideabi
而不是:
主机=臂-Linux的EABI
对于binutils和gcc配置。除了使用-mandroid和-mbionic标志之外,还建立了GCC来请求Android CRT(C运行时)文件的正确名称...又名crtbegin_dynamic.o和crtend_android.o ... NOT crt0.o等glibc(或newlib?)CRT文件。

CAVEATS

  1. 可能需要对binutils和gcc configure使用--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将在正确的标题上运行。