lfs-7.7学习笔记(2)构建临时系统
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)系统配置