Chinaunix首页 | 论坛 | 博客
  • 博客访问: 166557
  • 博文数量: 18
  • 博客积分: 299
  • 博客等级: 二等列兵
  • 技术积分: 731
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-19 00:39
文章分类

全部博文(18)

文章存档

2013年(7)

2012年(11)

分类: LINUX

2013-01-11 16:39:18

在上几个章节当中,我们成功创建了一个新的文件系统,并且将lfs目录挂载在这个文件系统下面;创建了lfs这个用户,并且制造了一系列和这个用户相关的环境变量,组群等设置。

本章阶段开始,我们将要制作一个可以编译我们的lfs系统的临时的最小的干净的环境。


所有的下列包将会安装在$LFS/tools这个目录下面。

(以下操作都在lfs下进行)


1,编译binutils-2.22.tar.bz2 (第一步)


点击(此处)折叠或打开

  1. tar xvjf binutils-2.22.tar.bz2

解压缩


点击(此处)折叠或打开

  1. cd binutils-2.22/

进入到解压缩的目录


点击(此处)折叠或打开

  1. patch -Np1 -i ../binutils-2.22-build_fix-1.patch

patch

点击(此处)折叠或打开

  1. mkdir -v ../binutils-build
  2. cd ../binutils-build

创建编译目录并且进入这个目录。

点击(此处)折叠或打开

  1. ../binutils-2.22/configure \
  2.     --prefix=/tools \
  3.     --with-sysroot=$LFS \
  4.     --with-lib-path=/tools/lib \
  5.     --target=$LFS_TGT \
  6.     --disable-nls \
  7.     --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的一系列依赖。


点击(此处)折叠或打开

  1. tar -Jxf ../mpfr-3.1.1.tar.xz
  2. mv -v mpfr-3.1.1 mpfr
  3. tar -Jxf ../gmp-5.0.5.tar.xz
  4. mv -v gmp-5.0.5 gmp
  5. tar -zxf ../mpc-1.0.tar.gz
  6. mv -v mpc-1.0 mpc


运行下列脚本



点击(此处)折叠或打开

  1. for file in \
  2.  $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
  3. do
  4.   cp -uv $file{,.orig}
  5.   sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
  6.       -e 's@/usr@/tools@g' $file.orig > $file
  7.   echo '
  8. #undef STANDARD_STARTFILE_PREFIX_1
  9. #undef STANDARD_STARTFILE_PREFIX_2
  10. #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
  11. #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  12.   touch $file.orig
  13. done



含义:将目录下的叫做linux.hlinux64.h 或者sysv4.h3个文件找出来,对每一个文件,先拷贝成这个文件名字加上.orig后缀的文件,然后将.orig文件里的“/lib/ld, “/lib64/ld” or “/lib32/ld加上前缀/tools,第二个是将/usr替换成/tools。然后替换好了加上之后那些宏。并且更新orig的时间,这是为了防止两次将file拷贝成orig。第一个cp 里面有一个-u的命令,这个命令就是只有当sourcedst要更加新的时候才进行拷贝。


在配置文件里增加 agcc_cv_libc_provides_ssp 的配置,开启堆栈保护功能。不增加这个会在编译Glibc-2.16.0的时候会有问题。


点击(此处)折叠或打开

  1. sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure

建立编译文件夹:



点击(此处)折叠或打开

  1. mkdir -v ../gcc-build
  2. cd ../gcc-build

gcc的编译配置选项:


点击(此处)折叠或打开

  1. ../gcc-4.7.1/configure \
  2.     --target=$LFS_TGT \
  3.     --prefix=/tools \
  4.     --with-sysroot=$LFS \
  5.     --with-newlib \
  6.     --without-headers \
  7.     --with-local-prefix=/tools \
  8.     --with-native-system-header-dir=/tools/include \
  9.     --disable-nls \
  10.     --disable-shared \
  11.     --disable-multilib \
  12.     --disable-decimal-float \
  13.     --disable-threads \
  14.     --disable-libmudflap \
  15.     --disable-libssp \
  16.     --disable-libgomp \
  17.     --disable-libquadmath \
  18.     --enable-languages=c \
  19.     --with-mpfr-include=$(pwd)/../gcc-4.7.1/mpfr/src \
  20.     --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语言。



点击(此处)折叠或打开

  1. make

  2. make install

编译库




点击(此处)折叠或打开

  1. 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软连接在一起,这部分一定要做,要不然后面会报错。


错误信息如下:


点击(此处)折叠或打开

  1. x-gnu/bin/ld: cannot find -lgcc_eh
  2. collect2: error: ld returned 1 exit status
  3. make[2]: *** [/mnt/lfs/sources/glibc-build/elf/sln] Error 1
  4. make[2]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0/elf'
  5. make[1]: *** [elf/others] Error 2
  6. make[1]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0'
  7. make: *** [all] Error 2
余下的二十多个库由于过程类似,不再雷述。

余下的库的列表:
阅读(6229) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~