跟着我来一起编译lfs(二) 工具链编译初识

建立交叉编译环境,这个步骤比较长及繁琐,耗时非常长,中间要准备好零食、饮料、连续剧,当然也可以LOL,尽量在娱乐中度过。

这里要理解一下交叉编译环境是干什么的?为什么要有这个环境?

首先我们最终的目的就是完成一个独立mini linux操作系统,记得前一章我们添加的那块虚拟硬盘么,这个系统将会在这块硬盘上产生,而产生这个系统的过程就是要用编译等工具生产相应的二进制文件,但是如果我们直接编译出二进制文件放在虚拟硬盘中,最终将无法运行,因为这块虚拟的硬盘上只有二进制文件,对应的依赖包等在我们的centos(及宿主机)中,所以我们先用centos(及宿主机)的编译工具和下载的源码编译出一套工具链,然后再用这个编译出来的工具链和下载的源码编译出独立的工具链。这样整个工具链及环境就都在我们的虚拟硬盘上,后面脱离宿主机一样可以运行。

好的,大概解释了一下,可能有不完整的地方,大家大概知道意思就可以。

第一件事

echo $LFS

/mnt/lfs

查看环境,这一步一定要看清楚!!!!!

接下来开始第一次工具链编译

cd $LFS/sources

编译Binutils

tar jxf binutils-2.27.tar.bz2
cd binutils-2.27
mkdir -v build
cd build
../configure --prefix=/tools \
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror

如果报错看看是不是GCC C++等工具没有安装?yum install 缺少的工具

make

64位系统添加一个lib64目录的软连接

case $(uname -m) in
  x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
make install

编译GCC

这一步出错的可能性比较高,我们继续

重新进入sources目录

cd $LFS/sources
tar jxf gcc-6.2.0.tar.bz2
cd gcc-6.2.0
tar -xf ../mpfr-3.1.4.tar.xz
mv -v mpfr-3.1.4 mpfr
tar -xf ../gmp-6.1.1.tar.xz
mv -v gmp-6.1.1 gmp
tar -xf ../mpc-1.0.3.tar.gz
mv -v mpc-1.0.3 mpc

修改 GCC 默认的动态链接器为安装在 /tools 文件夹中的

for file in \
 $(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
mkdir -v build
cd build
../configure \
--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++
make
make install

Linux-4.7.2 API Headers

cd $LFS/sources
xz -d linux-4.7.2.tar.xz  (如果你是从我分享的网盘下的源码,可能已经解压成tar了,报错就忽略)
tar xf linux-4.7.2.tar
cd linux-4.7.2
make mrproper
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include

Glibc

cd $LFS/sources
xz -d glibc-2.24.tar.xz  (如果你是从我分享的网盘下的源码,可能已经解压成tar了,报错就忽略)
tar xf glibc-2.24.tar
cd glibc-2.24
mkdir -v build
cd build
../configure \
--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
make
make install

到这第一次编译快结束了,我们来验证一下,编译的东西是否正确。

换一个目录

cd ~
echo 'int main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools'

正常情况,首该没有任何错误,然后显示
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

如果输出不是像上面那样或者根本就没有输出,那么可能某些地方出错了。调查并回溯这些步骤,找出问题所在并改正它。在继续之前必须解决这个问题。

一旦一切都顺利,清理测试文件:

rm -v dummy.c a.out

我们继续


Libstdc++

Libstdc++ 是 GCC 源文件的一部分,我们还是使用gcc-6.2.0源码,先删除之前的,重新解压

cd $LFS/sources
rm -rf gcc-6.2.0
tar jxf gcc-6.2.0.tar.bz2
cd gcc-6.2.0
mkdir -v build
cd build
../libstdc++-v3/configure           \
    --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
make
make install

好了,第一次工具链编译结束了,如果一切都顺利的话,恭喜你!否则我想你应该是很郁闷的,各种报错。

这里很多编译时的参数都没有详细介绍,因为写出来篇幅会比较多,而且官网上也有,其次,如果你是第一次玩lfs建议你就忽略吧,先弄出来再说。

休息一下~后面准备第二次编译。