在上几个章节当中,我们成功创建了一个新的文件系统,并且将lfs目录挂载在这个文件系统下面;创建了lfs这个用户,并且制造了一系列和这个用户相关的环境变量,组群等设置。
本章阶段开始,我们将要制作一个可以编译我们的lfs系统的临时的最小的干净的环境。
所有的下列包将会安装在$LFS/tools这个目录下面。
(以下操作都在lfs下进行)
1,编译binutils-2.22.tar.bz2 (第一步)
- tar xvjf binutils-2.22.tar.bz2
解压缩
进入到解压缩的目录
- patch -Np1 -i ../binutils-2.22-build_fix-1.patch
打
patch
- mkdir -v ../binutils-build
- cd ../binutils-build
创建编译目录并且进入这个目录。
- ../binutils-2.22/configure \
- --prefix=/tools \
- --with-sysroot=$LFS \
- --with-lib-path=/tools/lib \
- --target=$LFS_TGT \
- --disable-nls \
- --disable-werror
逐条解释配置编译的configure
--prefix=/tools告诉配置脚本准备编译的Binutils程序需要放在/tools目录下。
--with-sysroot=$LFS告诉交叉编译系统,在$LFS里面寻找目标系统所需要的库。
--with-lib-path=/tools/lib指定链接程序的位置。
--target=$LFS_TGT为交叉编译的链接器指定机器的描述。
--disable-nls去除不需要的功能。
--disable-werror去除由于warning而造成的停止编译的情况。
2,编译gcc-4.7.1.tar.bz2(第一步)
首先解压缩gcc的一系列依赖。
- tar -Jxf ../mpfr-3.1.1.tar.xz
- mv -v mpfr-3.1.1 mpfr
- tar -Jxf ../gmp-5.0.5.tar.xz
- mv -v gmp-5.0.5 gmp
- tar -zxf ../mpc-1.0.tar.gz
- mv -v mpc-1.0 mpc
运行下列脚本
- 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
含义:将目录下的叫做linux.h, linux64.h 或者sysv4.h这3个文件找出来,对每一个文件,先拷贝成这个文件名字加上.orig后缀的文件,然后将.orig文件里的“/lib/ld”, “/lib64/ld” or “/lib32/ld”加上前缀/tools,第二个是将/usr替换成/tools。然后替换好了加上之后那些宏。并且更新orig的时间,这是为了防止两次将file拷贝成orig。第一个cp 里面有一个-u的命令,这个命令就是只有当source比dst要更加新的时候才进行拷贝。
在配置文件里增加 agcc_cv_libc_provides_ssp 的配置,开启堆栈保护功能。不增加这个会在编译Glibc-2.16.0的时候会有问题。
- sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure
建立编译文件夹:
- mkdir -v ../gcc-build
- cd ../gcc-build
gcc的编译配置选项:
- ../gcc-4.7.1/configure \
- --target=$LFS_TGT \
- --prefix=/tools \
- --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-libmudflap \
- --disable-libssp \
- --disable-libgomp \
- --disable-libquadmath \
- --enable-languages=c \
- --with-mpfr-include=$(pwd)/../gcc-4.7.1/mpfr/src \
- --with-mpfr-lib=$(pwd)/mpfr/src/.libs
对每个配置选项的解释:
--with-newlib保证
libgcc编译过程中正常运行。
--without-headers
不需要头文件的寻找。
--with-local-prefix=/tools
在本地寻找安装好的头文件。
--with-native-system-header-dir=/tools/include
确保系统头文件在/tools里寻找而不是在host机器上。
--disable-shared
只链接内部的lib,防止跟host机有关联。
--disable-decimal-float, --disable-threads, --disable-libmudflap, --disable-libssp, --disable-libgomp, --disable-libquadmath
关掉一些暂时编译不过去的功能。
--disable-multilib
不支持多lib
--enable-languages=c
仅仅使用
c语言。
编译库
- ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`
由于之前用了--disable-shared关闭了lib链接,不能产生 libgcc_eh.a,但是之后的编译会用到 libgcc_eh.a,于是这边就先将libgcc.a跟 libgcc_eh.a软连接在一起,这部分一定要做,要不然后面会报错。
错误信息如下:
- x-gnu/bin/ld: cannot find -lgcc_eh
- collect2: error: ld returned 1 exit status
- make[2]: *** [/mnt/lfs/sources/glibc-build/elf/sln] Error 1
- make[2]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0/elf'
- make[1]: *** [elf/others] Error 2
- make[1]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0'
- make: *** [all] Error 2
余下的二十多个库由于过程类似,不再雷述。
余下的库的列表:
阅读(6229) | 评论(0) | 转发(1) |