我正在为我的设备交叉构建本机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'
省去工具链的变量以节省空间。
答案 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