lfs-7.7学习笔记(2)构建临时系统

三、构建临时文件系统

默认编译使用的用户是lfs,所在目录为 /opt/lfs/source,编译软件前需先解压源码包,在进入解压后的路径,此过程省略

3.1 编译Binutils-2.25

cd $LFS/sources
tar -xf binutils-2.25.tar.bz2 
cd binutils-2.25

此过程下面略过
创建编译目录:

mkdir -v  $LFS/sources/binutils-build   && $LFS/source/binutils-build

编译参数:

../binutils-2.25/configure \
--prefix=/tools \
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror

编译:

make 

64位系统要建符号链接:

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

安装:

make install

3.2 安装交叉编译的 GCC

tar -xf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 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

修复GCC的栈保护:

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

创建编译目录:

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

准备编译gcc

 ../gcc-4.9.2/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-libatomic \
 --disable-libgomp \
 --disable-libitm \
 --disable-libquadmath \
 --disable-libsanitizer \
 --disable-libssp \
 --disable-libvtv \
 --disable-libcilkrts \
 --disable-libstdc++-v3 \
 --enable-languages=c,c++

编译并安装:

make && make install

编译比较耗时

3.3 安装 Linux API 头文件

cd $LFS/sources
tar -xf linux-3.19.tar.xz
cd linux-3.19
make mrproper
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include

3.4 安装Glibc

在glibc源码目录测试并安装rpc头文件:

if [ ! -r /usr/include/rpc/types.h ]; then
 su -c 'mkdir -pv /usr/include/rpc'
 su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc'
fi

这一步可能要输入lfs用户密码
修复一个32位架构的bug:

sed -e '/ia32/s/^/1:/' \
 -e '/SSE2/s/^1://' \
 -i sysdeps/i386/i686/multiarch/mempcpy_chk.S

创建编译目录:

mkdir -v ../glibc-build
cd ../glibc-build

准备编译:

../glibc-2.21/configure \
 --prefix=/tools \
 --host=$LFS_TGT \
 --build=$(../glibc-2.21/scripts/config.guess) \
 --disable-profile \
 --enable-kernel=2.6.32 \
 --with-headers=/tools/include \
 libc_cv_forced_unwind=yes \
 libc_cv_ctors_header=yes \
 libc_cv_c_cleanup=yes

编译并安装:

make && make install

测试新工具链的基本功能

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

确保输出为:

[Requesting program interpreter: /tools/lib/ld-linux.so.2]   ---32位系统
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]   ---64位系统

3.5 安装目标 Libstdc++

Libstdc+ +是 GCC 源文件的一部分,准备编译 Libstdc+ +:

cd ../gcc-build
../gcc-4.9.2/libstdc++-v3/configure \
 --host=$LFS_TGT \
 --prefix=/tools \
 --disable-multilib \
 --disable-shared \
 --disable-nls \
 --disable-libstdcxx-threads \
 --disable-libstdcxx-pch \
 --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/4.9.2

编译并安装:

make && make install

3.6 第二次编译Binutils

LFS为了消除目标系统与宿主系统的依赖,需要多次编译binutils,gcc和glibc

cd ../binutils-build
rm -rf ./* 

准备编译:

CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../binutils-2.25/configure \
 --prefix=/tools \
--disable-nls \
--disable-werror \
 --with-lib-path=/tools/lib \
 --with-sysroot

编译并安装:

make && make install

为下一步准备链接器:

make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

3.7 第二次编译GCC

创建一个完整的内部系统头文件:

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

更改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

准备编译:

cd ../gcc-build
rm -rf ./* 

CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../gcc-4.9.2/configure \
 --prefix=/tools \
 --with-local-prefix=/tools \
 --with-native-system-header-dir=/tools/include \
 --enable-languages=c,c++ \
 --disable-libstdcxx-pch \
 --disable-multilib \
 --disable-bootstrap \
 --disable-libgomp

编译并安装:

make && make install

编译时间太久了 --!

创建cc的符号链接:

ln -sv gcc /tools/bin/cc

测试。和之前的一样:

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

测试没问题,删除测试产生的文件:

rm -v dummy.c a.out

3.8 安装 Tcl(tclsh)

tar -xf tcl8.6.3-src.tar.gz
cd  tcl8.6.3/unix/
./configure --prefix=/tools
make

测试:

TZ=UTC make test

安装:

make install

chmod -v u+w /tools/lib/libtcl8.6.so 

安装Tcl的头文件,编译expect时要用到:

make install-private-headers
ln -sv tcl8.6 /tools/bin/tclsh

3.9 安装expect

修改configure文件,不使用宿主机的stty:

cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure

准备编译:

./configure --prefix=/tools  --with-tcl=/tools/lib  --with-tclinclude=/tools/include

编译并安装:

make
make test
make SCRIPTS="" install

3.10 安装 DejaGNU (runtest)

./configure --prefix=/tools
make install
make check

3.11 安装 Check(checkmk)

PKG_CONFIG= ./configure --prefix=/tools
make   
make install

3.12 安装 Ncurses

./configure --prefix=/tools  --with-shared  --without-debug  --without-ada  --enable-widec  --enable-overwrite
make && make install

3.13 安装 Bash

tar -xf bash-4.3.30.tar.gz
cd bash-4.3.30
./configure --prefix=/tools --without-bash-malloc
make &&     make install

创建sh的软链接:

ln -sv bash /tools/bin/sh

3.14 安装 Bzip2

make
make PREFIX=/tools install

3.15 安装 Coreutils

./configure --prefix=/tools --enable-install-program=hostname
make && make install

3.16 安装 Diffutils

./configure --prefix=/tools
make && make install

3.17 安装 File

./configure --prefix=/tools
make && make install

3.18 安装 Findutils

./configure --prefix=/tools
make && make install

3.19 安装 Gawk

./configure --prefix=/tools
make && make install

3.20 安装Gettext

tar -xf gettext-0.19.4.tar.xz 
cd  gettext-0.19.4/gettext-tools/
EMACS="no" ./configure --prefix=/tools --disable-shared

make -C gnulib-lib
make -C intl pluralx.c
make -C src msgfmt
make -C src msgmerge
make -C src xgettext

cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin

3.21 安装 Grep

./configure --prefix=/tools
make && make install

3.22 安装 Gzip

./configure --prefix=/tools
make && make install

3.23 安装 M4

tar -xf m4-1.4.17.tar.xz  && cd m4-1.4.17
./configure --prefix=/tools
make && make install

3.24 安装 Make

./configure --prefix=/tools --without-guile
make && make install

3.25 安装 Patch

 ./configure --prefix=/tools
 make && make install

3.26 安装 Perl

tar -xf perl-5.20.2.tar.bz2 && cd perl-5.20.2
sh Configure -des -Dprefix=/tools -Dlibs=-lm
make
cp -v perl cpan/podlators/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.20.2
cp -Rv lib/* /tools/lib/perl5/5.20.2

3.27 安装 Sed

./configure --prefix=/tools
make && make install

3.29 安装 Tar

./configure --prefix=/tools
make && make install

3.30 安装 Texinfo

./configure --prefix=/tools
make && make install

3.31 安装 Util-linux

tar -xf util-linux-2.26.tar.xz && cd util-linux-2.26
./configure --prefix=/tools  --without-python  --disable-makeinstall-chown  --without-systemdsystemunitdir  PKG_CONFIG=""
make && make install

3.32 安装Xz

./configure --prefix=/tools
make && make install

3.33 改变属主

退出lfs用户,使用root用户

chown -R root:root $LFS/tools

lfs-7.7学习笔记(1)准备篇
lfs-7.7学习笔记(2)构建临时系统
lfs-7.7学习笔记(3)构建 LFS 系统
lfs-7.7学习笔记(4)系统配置