LFS7.4编译笔记(1)

时间:2023-03-09 09:42:13
LFS7.4编译笔记(1)

由于第一次编译,花了不少时间,也不知道能不能成功,所以就没有记笔记,现在重新编译一次,这次不装U盘而是装到我的移动硬盘上面。步骤差不多,因为我感觉硬盘的速度会比U盘快。

至于LFS的优点,我就不多说了,相信你只要听过LFS这个词,就一定会知道它的优点的。这里我用的是最新版的LFS7.4,因为最新版的都会修复一些错误,或者编译方法会更合理一些。

下面就是我的安装之路:

1.首先就是分区,建立文件系统,挂载文件系统

我的分区如下:

LFS7.4编译笔记(1)

/dev/sdb是我的移动硬盘,大概有80G大小吧。上图中的/dev/sdb1是作为/boot分区的,有100M左右,/dev/sdb2是作为/分区的,有10G左右,余下的是我真正存储档案的硬盘。至于怎么分区,查一下fdisk命令的用法,其实很简单的。不过记得要把/dev/sdb1标记为可引导的,也就是我们的/boot分区。

分区完了之后,建立文件系统,也就是格式化为ext4文件系统。

mkfs -v -t ext4 /dev/sdb1
mkfs -v -t ext4 /dev/sdb2

这里我没有分swap分区,因为我的宿主系统已经有swap分区了,编译时就可以使用。至于新系统,可以编译结束后在新系统中再分swap也一样。

接着就是挂载这些文件系统了。

export LFS=/mnt/lfs 
mkdir -pv $LFS
mount -v -t ext4 /dev/sdb2 $LFS
mkdir -pv $LFS/boot
mount -v -t ext4 /dev/sdb1 $LFS/boot

2.准备软件包和一些补丁。

mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
wget -i wget-list -P $LFS/sources pushd $LFS/sources
md5sum -c md5sums
popd

3. 最后的准备:

mkdir -v $LFS/tools
ln -sv $LFS/tools /tools    #文档中用的是 ln -sv $LFS/tools /  (此为简写形式)

添加用户:

groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
chown -v lfs $LFS/sources
chown -v lfs $LFS/tools
su - lfs

设置用户lfs的环境变量:

cat > ~/.bash_profile <<EOF
exec env -i HOME=$HOME TERM=$TERM /bin/bash
EOF cat > ~/.bashrc <<EOF
set +h
umask
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
PS1="\$? \u@\h \w\$ "
export LFS LC_ALL LFS_TGT PATH PS1
EOF

加载刚设置的环境:

source ~/.bash_profile

到此,我们的环境已经设置好了。export一下应该会是这样的:

LFS7.4编译笔记(1)

尤其注意LFS、LFS_TGT、PATH这几个变量的值。其中,变量PS1我们使用了一个小技巧,在最前面是$?,这样我们执行一个命令的时候,可以看看前面的值是不是0,如果是0就表示上一步的命令正确执行了,否则的话,就表示上一步出错了。

如果这些变量正确的话,就继续。

4. 开始编译临时的系统

编译之前首先确定LFS变量的值是/mnt/lfs,另外要满足host system的要求

之后,进入$LFS/sources目录开始编译。

cd $LFS/sources

Binutils-2.23.2 - Pass 1

tar xvf binutils-2.23..tar.bz2
cd binutils-2.23.
sed -i -e 's/@colophon/@@colophon/'
-e 's/doc@cygnus.com/doc@@cygnus.com/' bfd/doc/bfd.texinfo
mkdir -v ../binutils-build
cd ../binutils-build
../binutils-2.23./configure \
--prefix=/tools \
--with-sysroot=$LFS \
--target=$LFS_TGT \
--with-lib-path=/tools/lib \
--disable-nls \
--disable-werror
make
make install
cd ..
rm -rf binutils-build bintuils-2.23.

GCC-4.8.1 - Pass 1

 tar xvf gcc-4.8..tar.bz2
cd gcc-4.8.
tar -Jxf ../mpfr-3.1..tar.xz
mv -v mpfr-3.1. mpfr
tar -Jxf ../gmp-5.1..tar.xz
mv -v gmp-5.1. 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 sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.8./configure \
--prefix=/tools \
--with-sysroot=$LFS \
--target=$LFS_TGT \
--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-libmudflap \
--disable-libquadmath \
--disable-libsanitizer \
--disable-libssp \
--disable-libstdc++-v3 \
--enable-languages=c,c++ \
--with-mpfr-include=$(pwd)/../gcc-4.8./mpfr/src \
--with-mpfr-lib=$(pwd)/mpfr/src/.libs
make
make install
ln -sv libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'` cd ..
rm -rf gcc-build gcc-4.8.

Linux-3.10.10 API Headers

 tar xvf linux-3.10..tar.xz
cd linux-3.10.
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
cd ..
rm -rf linux-3.10.10

Glibc-2.18

 tar xvf glibc-2.18.tar.xz
cd glibc-2.18
if [ ! -r /usr/include/rpc/types.h ]; then
su -c 'mkdir -p /usr/include/rpc'
su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc'
fi
sed -i -e 's/static __m128i/inline &/' sysdeps/x86_64/multiarch/strstr.c
mkdir -v ../glibc-build
cd ../glibc-build
../glibc-2.18/configure \
--prefix=/tools \
--host=$LFS_TGT \
--build=$(../glibc-2.18/scripts/config.guess) \
--disable-profile \
--enable-kernel=2.6. \
--with-headers=/tools/include \
libc_cv_forced_unwind=yes \
libc_cv_ctors_header=yes \
libc_cv_c_cleanup=yes
make
make install
cd ..
rm -rf glibc-2.18 glibc-build

到这里需要测试一下:

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

如果输出是

[Requesting program interpreter: /tools/lib/ld-linux.so.2]
就可以继续了。否则一定要查看是哪里出了问题并在继续之前纠正。

rm -v dummy.c a.out

Libstdc++-4.8.1

 tar xvf gcc-4.8..tar.bz2
cd gcc-4.8.
mkdir -pv ../gcc-build
cd ../gcc-build
../gcc-4.8./libstdc++-v3/configure \
--prefix=/tools \
--host=$LFS_TGT \
--disable-multilib \
--disable-shared \
--disable-nls \
--disable-libstdcxx-threads \
--disable-libstdcxx-pch \
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/4.8.
make
make install
cd ..
rm -rf gcc-4.8. gcc-build

Binutils-2.23.2 - Pass 2

 tar xvf binutils-2.23..tar.bz2
cd binutils-2.23.
sed -i -e 's/@colophon/@@colophon/' \
-e 's/doc@cygnus.com/doc@@cygnus.com/' bfd/doc/bfd.texinfo
mkdir -v ../binutils-build
cd ../binutils-build
CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../binutils-2.23./configure \
--prefix=/tools \
--disable-nls \
--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
cd ..
rm -rf binutils-2.23. binutils-build

GCC-4.8.1 - Pass 2

 tar xvf gcc-4.8..tar.bz2
cd gcc-4.8.
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
cp -v gcc/Makefile.in{,.tmp}
sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp > gcc/Makefile.in
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 tar -Jxf ../mpfr-3.1..tar.xz
mv -v mpfr-3.1. mpfr
tar -Jxf ../gmp-5.1..tar.xz
mv -v gmp-5.1. gmp
tar -zxf ../mpc-1.0..tar.gz
mv -v mpc-1.0. mpc
mkdir -v ../gcc-build
cd ../gcc-build CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../gcc-4.8./configure \
--prefix=/tools \
--with-local-prefix=/tools
--with-native-system-header-dir=/tools/include \
--enable-clocale-gnu \
--enable-shared \
--enable-threads=posix \
--enable-__cxa_atexit \
--enable-languages=c,c++ \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp \
--with-mpfr-include=$(pwd)/../gcc-4.8./mpfr/src \
--with-mpfr-lib=$(pwd)/mpfr/src/.libs
make
make install
ln -sv gcc /tools/bin/cc
cd ..
rm -rf gcc-4.8. gcc-build

到此,还得进一步验证:

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

[Requesting program interpreter: /tools/lib/ld-linux.so.2]
表示正确。可以继续

rm -v dummy.c a.out

Tcl-8.6.0

 tar xvf tcl8.6.0-src.tar.gz
cd tcl8.6.0-src
sed -i s/// generic/regc_nfa.c
cd unix
./configure --prefix=/tools
make
TZ=UTC make test
make install
chmod -v u+w /tools/lib/libtcl8..so
make install-private-headers
ln -sv tclsh8. /tools/bin/tclsh
cd ../.. rm -rf tcl8.6.0-src

Expect-5.45

 tar xvf expect5..tar.gz
cd expect5.
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
cd ..
rm -rf expect5.

DejaGNU-1.5.1

tar xvf dejagnu-1.5..tar.gz
cd dejagnu-1.5.
./configure --prefix=/tools
make install
make check
cd ..
rm -rf dejagnu-1.5.

Check-0.9.10

tar xvf check-0.9..tar.gz
cd check-0.9.
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf check-0.9.

Ncurses-5.9

tar xvf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure \
--prefix=/tools \
--with-shared \
--without-debug \
--without-ada \
--enable-overwrite
make
make install
cd ..
rm -rf ncurses-5.9

Bash-4.2

tar xvf bash-4.2.tar.gz
cd bash-4.2
patch -Np1 -i ../bash-4.2-fixes-.patch
./configure --prefix=/tools --without-bash-malloc
make
make tests
make install
ln -sv bash /tools/bin/sh
cd ..
rm -rf bash-4.2

Bzip2-1.0.6

tar xvf bzip2-1.0..tar.gz
cd bzip2-1.0.
make
make PREFIX=/tools install
cd ..
rm -rf bzip2-1.0.

Coreutils-8.21

tar xvf coreutils-8.21.tar.xz
cd coreutils-8.21
./configure --prefix=/tools --enable-install-program=hostname
make
make RUN_EXPENSIVE_TESTS=yes check
make install
cd ..
rm -rf coreutils-8.21

Diffutils-3.3

tar xvf diffutils-3.3.tar.xz
cd diffutils-3.3
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf diffutils-3.3

File-5.14

tar xvf file-5.14.tar.gz
cd file-5.14
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf file-5.14

Findutils-4.4.2

tar xvf findutils-4.4..tar.gz
cd findutils-4.4.
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf findutils-4.4.

Gawk-4.1.0

tar xvf gawk-4.1..tar.xz
cd gawk-4.1.
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf gawk-4.1.

Gettext-0.18.3

tar xvf gettext-0.18..tar.gz
cd gettext-0.18.
cd gettext-tools
EMACS="no" ./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C src msgfmt
cp -v src/msgfmt /tools/bin
cd ../..
rm -rf gettext-,18.3

Grep-2.14

tar xvf grep-2.14.tar.xz
cd grep-2.14
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf grep-2.14

Gzip-1.6

tar xvf gzip-1.6.tar.xz
cd gzip-1.6
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf gzip-1.6

M4-1.4.16

tar xvf m4-1.4..tar.bz2
cd m4-1.4.
sed -i -e '/gets is a/d' lib/stdio.in.h
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf m4-1.4.

Make-3.82

tar xvf make-3.82.tar.bz2
cd make-3.82
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf make-3.82

Patch-2.7.1

tar xvf patch-2.7..tar.xz
cd patch-2.7.
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf patch-2.7.

Perl-5.18.1

 tar xvf perl-5.18..tar.bz2
cd perl-5.18.
patch -Np1 -i ../perl-5.18.-libc-.patch
sh Configure -des -Dprefix=/tools
make
cp -v perl cpan/podlators/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.18.
cp -Rv lib/* /tools/lib/perl5/5.18.1
cd ..
rm -rf perl-5.18.1

Sed-4.2.2

tar xvf sed-4.2..tar.bz2
cd sed-4.2.
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf sed-4.2.

Tar-1.26

tar xvf tar-1.26.tar.bz2
cd tar-1.26
sed -i -e '/gets is a/d' gnu/stdio.in.h
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf tar-1.26

Texinfo-5.1

tar xvf texinfo-5.1.tar.xz
cd texinfo-5.1
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf texinfo-5.1

Xz-5.0.5

tar xvf xz-5.0..tar.xz
cd xz-5.0.
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf xz-5.0.

移除调试符号:

strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*
rm -rf /tools/{,share}/{info,man,doc}

余下部分必须是root用户操作,不再需要lfs用户了。

su -
chown -R root:root $LFS/tools

到此,我们的临时系统已经搭建完成,工具链也可以在此备份以便将来使用。