建立交叉编译环境,这个步骤比较长及繁琐,耗时非常长,中间要准备好零食、饮料、连续剧,当然也可以LOL,尽量在娱乐中度过。
这里要理解一下交叉编译环境是干什么的?为什么要有这个环境?
首先我们最终的目的就是完成一个独立mini linux操作系统,记得前一章我们添加的那块虚拟硬盘么,这个系统将会在这块硬盘上产生,而产生这个系统的过程就是要用编译等工具生产相应的二进制文件,但是如果我们直接编译出二进制文件放在虚拟硬盘中,最终将无法运行,因为这块虚拟的硬盘上只有二进制文件,对应的依赖包等在我们的centos(及宿主机)中,所以我们先用centos(及宿主机)的编译工具和下载的源码编译出一套工具链,然后再用这个编译出来的工具链和下载的源码编译出独立的工具链。这样整个工具链及环境就都在我们的虚拟硬盘上,后面脱离宿主机一样可以运行。
好的,大概解释了一下,可能有不完整的地方,大家大概知道意思就可以。
第一件事
/mnt/lfs
查看环境,这一步一定要看清楚!!!!!
接下来开始第一次工具链编译
编译Binutils
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror
如果报错看看是不是GCC C++等工具没有安装?yum install 缺少的工具
64位系统添加一个lib64目录的软连接
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
编译GCC
这一步出错的可能性比较高,我们继续
重新进入sources目录
修改 GCC 默认的动态链接器为安装在 /tools 文件夹中的
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done
--target=$LFS_TGT \
--prefix=/tools \
--with-glibc-version=2.11 \
--with-sysroot=$LFS \
--with-newlib \
--without-headers \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libmpx \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--enable-languages=c,c++
Linux-4.7.2 API Headers
Glibc
--prefix=/tools \
--host=$LFS_TGT \
--build=$(../scripts/config.guess) \
--enable-kernel=2.6.32 \
--with-headers=/tools/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
到这第一次编译快结束了,我们来验证一下,编译的东西是否正确。
换一个目录
正常情况,首该没有任何错误,然后显示
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]
如果输出不是像上面那样或者根本就没有输出,那么可能某些地方出错了。调查并回溯这些步骤,找出问题所在并改正它。在继续之前必须解决这个问题。
一旦一切都顺利,清理测试文件:
我们继续
Libstdc++
Libstdc++ 是 GCC 源文件的一部分,我们还是使用gcc-6.2.0源码,先删除之前的,重新解压
--host=$LFS_TGT \
--prefix=/tools \
--disable-multilib \
--disable-nls \
--disable-libstdcxx-threads \
--disable-libstdcxx-pch \
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/6.2.0
好了,第一次工具链编译结束了,如果一切都顺利的话,恭喜你!否则我想你应该是很郁闷的,各种报错。
这里很多编译时的参数都没有详细介绍,因为写出来篇幅会比较多,而且官网上也有,其次,如果你是第一次玩lfs建议你就忽略吧,先弄出来再说。
休息一下~后面准备第二次编译。