LFS 搭建 5 正式构建 (2)

现在继续构建剩下的软件包。

构建软件包

Inetutils-2.1

1
2
tar -xvf inetutils-2.1.tar.xz
cd inetutils-2.1

configure

1
2
3
4
5
6
7
8
9
10
./configure --prefix=/usr        \
--bindir=/usr/bin \
--localstatedir=/var \
--disable-logger \
--disable-whois \
--disable-rcp \
--disable-rexec \
--disable-rlogin \
--disable-rsh \
--disable-servers

编译,检查,安装:

1
2
3
make
make check
make install

移动位置:

mv -v /usr/{,s}bin/ifconfig

Less-590

1
2
3
4
5
tar -xvf less-590.tar.gz
cd less-590
./configure --prefix=/usr --sysconfdir=/etc
make
make install

Perl-5.34.0

1
2
3
4
tar -xvf perl-5.34.0.tar.xz
cp perl-5.34.0-upstream_fixes-1.patch perl-5.34.0
cd perl-5.34.0
patch -Np1 -i perl-5.34.0-upstream_fixes-1.patch

perl找到已经安装好的库:

1
2
export BUILD_ZLIB=False
export BUILD_BZIP2=0

configure

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sh Configure -des                                         \
-Dprefix=/usr \
-Dvendorprefix=/usr \
-Dprivlib=/usr/lib/perl5/5.34/core_perl \
-Darchlib=/usr/lib/perl5/5.34/core_perl \
-Dsitelib=/usr/lib/perl5/5.34/site_perl \
-Dsitearch=/usr/lib/perl5/5.34/site_perl \
-Dvendorlib=/usr/lib/perl5/5.34/vendor_perl \
-Dvendorarch=/usr/lib/perl5/5.34/vendor_perl \
-Dman1dir=/usr/share/man/man1 \
-Dman3dir=/usr/share/man/man3 \
-Dpager="/usr/bin/less -isR" \
-Duseshrplib \
-Dusethreads

编译,测试,安装,清理环境变量:

1
2
3
4
make
make test
make install
unset BUILD_ZLIB BUILD_BZIP2

XML::Parser-2.46

1
2
3
4
5
6
tar -xvf XML-Parser-2.46.tar.gz
cd XML-Parser-2.46
perl Makefile.PL
make
make test
make install

Intltool-0.51.0

1
2
tar -xvf intltool-0.51.0.tar.gz
cd intltool-0.51.0

修复由perl-5.22及更新版本导致的警告:

sed -i 's:\\\${:\\\$\\{:' intltool-update.in

构建:

1
2
3
4
5
./configure --prefix=/usr
make
make check
make install
install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO

Autoconf-2.71

1
2
3
4
tar -xvf autoconf-2.71.tar.xz
cd autoconf-2.71
make
make check TESTSUITEFLAGS=-j5

这里检查也要开多线程,因为测试时间会很长。

Automake-1.16.4

1
2
3
4
5
6
tar -xvf automake-1.16.4.tar.xz
cd automake-1.16.4
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.16.4
make
make -j4 check
make install

此处检查也要开多线程,而且时间要长的多。

Kmod-29

1
2
tar -xvf kmod-29.tar.xz
cd kmod-29

configure

1
2
3
4
5
./configure --prefix=/usr          \
--sysconfdir=/etc \
--with-xz \
--with-zstd \
--with-zlib

编译

make

该包的测试因为依赖git,因此跳过。
安装该软件包,并创建与 Module-Init-Tools (曾经用于处理 Linux 内核模块的软件包) 兼容的符号链接:

1
2
3
4
5
6
7
make install

for target in depmod insmod modinfo modprobe rmmod; do
ln -sfv ../bin/kmod /usr/sbin/$target
done

ln -sfv kmod /usr/bin/lsmod

Elfutils-0.185 中的 Libelf

libelf 在包elfutils

1
2
tar -xvf elfutils-0.185.tar.bz2
cd elfutils-0.185

configure

1
2
3
./configure --prefix=/usr                \
--disable-debuginfod \
--enable-libdebuginfod=dummy

编译,检查:

1
2
make
make check

我编译时此处会报错FAIL: run-backtrace-native.sh。该错误已于 11 月 14 日提交于 Gentoo 的 bug 处理,但版本是 0.186。不过这里只需要libelf,所以问题不大。

其实跳过就好了……

只安装libelf

1
2
3
make -C libelf install
install -vm644 config/libelf.pc /usr/lib/pkgconfig
rm /usr/lib/libelf.a

Libffi-3.4.2

该包构建时会对特定处理器进行优化。

1
2
tar -xvf libffi-3.4.2.tar.gz
cd libffi-3.4.2

configure

1
2
3
4
./configure --prefix=/usr          \
--disable-static \
--with-gcc-arch=native \
--disable-exec-static-tramp

编译,检查,安装:

1
2
3
make
make check
make install

OpenSSL-1.1.1l

1
2
tar -xvf openssl-1.1.1l.tar.gz
cd openssl-1.1.1l

configure

1
2
3
4
5
./config --prefix=/usr         \
--openssldir=/etc/ssl \
--libdir=lib \
shared \
zlib-dynamic

编译,测试:

1
2
make
make test

已知测试30-test_afalg.t可能会失败,忽略即可。
安装:

1
2
sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile
make MANSUFFIX=ssl install

为安装目录加上版本号:

mv -v /usr/share/doc/openssl /usr/share/doc/openssl-1.1.1l

安装额外的文档(可选):

cp -vfr doc/* /usr/share/doc/openssl-1.1.1l

Python-3.9.6

还是一样的别解压错了。

1
2
tar -xvf Python-3.9.6.tar.xz
cd Python-3.9.6

configure

1
2
3
4
5
6
./configure --prefix=/usr       \
--enable-shared \
--with-system-expat \
--with-system-ffi \
--with-ensurepip=yes \
--enable-optimizations

编译,安装:

1
2
make
make install

此处不建议测试,但如果一定要,运行make test
安装预先格式化的文档(可选):

1
2
3
4
5
6
7
install -v -dm755 /usr/share/doc/python-3.9.6/html 

tar --strip-components=1 \
--no-same-owner \
--no-same-permissions \
-C /usr/share/doc/python-3.9.6/html \
-xvf ../python-3.9.6-docs-html.tar.bz2

没错,就是另外一个 python-doc 包。

Ninja-1.10.2

1
2
tar -xvf ninja-1.10.2.tar.gz
cd ninja-1.10.2

默认情况下,ninjia会尽量使用多进程,且进程数是 CPU 逻辑核心数 +2,以下修改可手动指定线程数:

export NINJAJOBS=4

或者使用环境变量NINJAJOBS

1
2
3
4
5
6
sed -i '/int Guess/a \
int j = 0;\
char* jobs = getenv( "NINJAJOBS" );\
if ( jobs != NULL ) j = atoi( jobs );\
if ( j > 0 ) return j;\
' src/ninja.cc

编译,测试:

1
2
3
python3 configure.py --bootstrap
./ninja ninja_test
./ninja_test --gtest_filter=-SubprocessTest.SetWithLots

安装:

1
2
3
install -vm755 ninja /usr/bin/
install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninja
install -vDm644 misc/zsh-completion /usr/share/zsh/site-functions/_ninja

Meson-0.59.1

1
2
3
4
5
6
7
tar -xvf meson-0.59.1.tar.gz
cd meson-0.59.1
python3 setup.py build
python3 setup.py install --root=dest
cp -rv dest/* /
install -vDm644 data/shell-completions/bash/meson /usr/share/bash-completion/completions/meson
install -vDm644 data/shell-completions/zsh/_meson /usr/share/zsh/site-functions/_meson

这个包没有测试。

Coreutils-8.32

需要打补丁。

1
2
3
4
tar -xvf coreutils-8.32.tar.xz
cp coreutils-8.32-i18n-1.patch coreutils-8.32
cd coreutils-8.32
patch -Np1 -i coreutils-8.32-i18n-1.patch

configure

1
2
3
4
autoreconf -fiv
FORCE_UNSAFE_CONFIGURE=1 ./configure \
--prefix=/usr \
--enable-no-install-program=kill,uptime

编译:

make

测试(可选):

1
2
3
4
5
make NON_ROOT_USERNAME=tester check-root
echo "dummy:x:102:tester" >> /etc/group
chown -Rv tester .
su tester -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"
sed -i '/dummy/d' /etc/group

安装:

make install

将程序移动到 FHS 要求的位置:

1
2
3
mv -v /usr/bin/chroot /usr/sbin
mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8
sed -i 's/"1"/"8"/' /usr/share/man/man8/chroot.8

Check-0.15.2

1
2
3
4
5
6
tar -xvf check-0.15.2.tar.gz
cd check-0.15.2
./configure --prefix=/usr --disable-static
make
make check
make docdir=/usr/share/doc/check-0.15.2 install

Diffutils-3.8

1
2
3
4
5
tar -xvf diffutils-3.8.tar.xz
cd diffutils-3.8
./configure --prefix=/usr
make
make install

Gawk-5.1.0

1
2
tar -xvf gawk-5.1.0.tar.xz
cd gawk-5.1.0

确保构建时不安装某些文件:

sed -i 's/extras//' Makefile.in

构建:

1
2
3
4
./configure --prefix=/usr
make
make check
make install

安装文档(可选):

1
2
mkdir -v /usr/share/doc/gawk-5.1.0
cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.1.0

Findutils-4.8.0

1
2
3
4
5
6
7
tar -xvf findutils-4.8.0.tar.xz
cd findutils-4.8.0
./configure --prefix=/usr --localstatedir=/var/lib/locate
make
chown -Rv tester .
su tester -c "PATH=$PATH make check"
make install

Groff-1.22.4

1
2
tar -xvf groff-1.22.4.tar.gz
cd groff-1.22.4

configure,并将默认纸张改为 A4:

PAGE=A4 ./configure --prefix=/usr

编译,安装,
此处编译强制-j1

1
2
make -j1
make install

GRUB-2.06

因为使用 UEFI,因此手册的安装流程不适用。
对于 BIOS,这里给出命令(不包括解压):
以下安装命令不支持 UEFI !

1
2
3
4
5
6
7
8
9
./configure --prefix=/usr          \
--sysconfdir=/etc \
--disable-efiemu \
--disable-werror
make
make install
mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions
make install
mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions

Gzip-1.10

1
2
3
4
5
tar -xvf gzip-1.10.tar.xz
cd gzip-1.10
make
make check
make install

IPRoute2-5.13.0

1
2
tar -xvf iproute2-5.13.0.tar.xz
cd iproute2-5.13.0

不安装arpd

1
2
sed -i /ARPD/d Makefile
rm -fv man/man8/arpd.8

禁用两个模块

sed -i 's/.m_ipt.o//' tc/Makefile

编译,安装:

1
2
make
make SBINDIR=/usr/sbin install

安装文档(可选):

1
2
mkdir -v              /usr/share/doc/iproute2-5.13.0
cp -v COPYING README* /usr/share/doc/iproute2-5.13.0

Kbd-2.4.0

需要打补丁。

1
2
3
4
tar -xvf kbd-2.4.0.tar.xz
cp kbd-2.4.0-backspace-1.patch kbd-2.4.0
cd kbd-2.4.0
patch -Np1 -i kbd-2.4.0-backspace-1.patch

删除多余的resizecons程序及其 man 页面:

1
2
sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure
sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in

构建:

1
2
3
4
./configure --prefix=/usr --disable-vlock
make
make check
make install

安装文档(可选):

1
2
mkdir -v            /usr/share/doc/kbd-2.4.0
cp -R -v docs/doc/* /usr/share/doc/kbd-2.4.0

Libpipeline-1.5.3

1
2
3
4
5
6
tar -xvf libpipeline-1.5.3.tar.gz
cd libpipeline-1.5.3
./configure --prefix=/usr
make
make check
make install

Make-4.3

1
2
3
4
5
6
tar -xvf make-4.3.tar.gz
cd make-4.3
./configure --prefix=/usr
make
make check
make install

检查是可选的。

Patch-2.7.6

1
2
3
4
5
6
tar -xvf patch-2.7.6.tar.xz
cd patch-2.7.6
./configure --prefix=/usr
make
make check
make install

Tar-1.34

1
2
tar -xvf tar-1.34.tar.xz
cd tar-1.34

configure

1
2
FORCE_UNSAFE_CONFIGURE=1  \
./configure --prefix=/usr

编译,检查:

1
2
make
make check

测试capabilities: binary store/restore的测试可能会失败或跳过。
安装:

1
2
make install
make -C doc install-html docdir=/usr/share/doc/tar-1.34

Texinfo-6.8

1
2
3
tar -xvf texinfo-6.8.tar.xz
cd texinfo-6.8
./configure --prefix=/usr

再次修复在使用 Glibc-2.34 或更新版本的系统上构建该软件包时出现的问题:

1
2
sed -e 's/__attribute_nonnull__/__nonnull/' \
-i gnulib/lib/malloc/dynarray-skeleton.c

编译,检查,安装:

1
2
3
make
make check
make install

安装 Tex 组件(可选):

make TEXMF=/usr/share/texmf install-tex

重更新 Info 文档(可选):

1
2
3
4
5
6
pushd /usr/share/info
rm -v dir
for f in *
do install-info $f dir 2>/dev/null
done
popd

Vim-8.2.3337

不会退出 vim 的去 BLFS 找其他编辑器

1
2
tar -xvf vim-8.2.3337.tar.gz
cd vim-8.2.3337

修改vimrc配置文件的默认位置为/etc

echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h

编译:

1
2
./configure --prefix=/usr
make

测试:

1
2
chown -Rv tester .
su tester -c "LANG=en_US.UTF-8 make -j1 test" &> vim-test.log

此处输出被重定向到了文件,要自行 cat。测试成功完成后,日志文件末尾会包含 “ALL DONE”。
安装:

make install

此处手册将vi改为了指向vim的符号链接。虽然大部分发行版会单独安装vi,但毕竟现在没多少人会用vi吧。
执行:

1
2
3
4
ln -sv vim /usr/bin/vi
for L in /usr/share/man/{,*/}man1/vim.1; do
ln -sv vim.1 $(dirname $L)/vi.1
done

创建文档的符号链接:

ln -sv ../vim/vim82/doc /usr/share/doc/vim-8.2.3337

Vim 配置

加入/etc/vimrc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc

" Ensure defaults are set before customizing settings, not after
source $VIMRUNTIME/defaults.vim
let skip_defaults_vim=1

set nocompatible
set backspace=2
set mouse=
syntax on
if (&term == "xterm") || (&term == "putty")
set background=dark
endif

" End /etc/vimrc
EOF

可根据自己喜好修改。虽然全局的这些就够了。

MarkupSafe-2.0.1

1
2
3
4
tar -xvf MarkupSafe-2.0.1.tar.gz
cd MarkupSafe-2.0.1
python3 setup.py build
python3 setup.py install --optimize=1

Jinja2-3.0.1

1
2
3
tar -xvf Jinja2-3.0.1.tar.gz
cd Jinja2-3.0.1
python3 setup.py install --optimize=1

Systemd-249

需要打补丁。

1
2
3
4
tar -xvf systemd-249.tar.gz
cp systemd-249-upstream_fixes-1.patch systemd-249
cd systemd-249
patch -Np1 -i systemd-249-upstream_fixes-1.patch

从默认的 udev 规则中删除不必要的组rendersgx

1
2
sed -i -e 's/GROUP="render"/GROUP="video"/' \
-e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in

准备编译,包括创建build

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mkdir -p build
cd build

LANG=en_US.UTF-8 \
meson --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--buildtype=release \
-Dblkid=true \
-Ddefault-dnssec=no \
-Dfirstboot=false \
-Dinstall-tests=false \
-Dldconfig=false \
-Dsysusers=false \
-Db_lto=false \
-Drpmmacrosdir=no \
-Dhomed=false \
-Duserdb=false \
-Dman=false \
-Dmode=release \
-Ddocdir=/usr/share/doc/systemd-249 \
..

编译,安装:

1
2
LANG=en_US.UTF-8 ninja
LANG=en_US.UTF-8 ninja install

安装 man 页面:

tar -xf ../../systemd-man-pages-249.tar.xz --strip-components=1 -C /usr/share/man

删除不必要的目录:

rm -rf /usr/lib/pam.d

初始化 machine id:

systemd-machine-id-setup

设定启动目标单元的基本结构:

systemctl preset-all

禁用一个服务:

systemctl disable systemd-time-wait-sync.service

D-Bus-1.12.20

1
2
tar -xvf dbus-1.12.20.tar.gz
cd dbus-1.12.20

configure

1
2
3
4
5
6
7
8
9
10
./configure --prefix=/usr                        \
--sysconfdir=/etc \
--localstatedir=/var \
--disable-static \
--disable-doxygen-docs \
--disable-xml-docs \
--docdir=/usr/share/doc/dbus-1.12.20 \
--with-console-auth-dir=/run/console \
--with-system-pid-file=/run/dbus/pid \
--with-system-socket=/run/dbus/system_bus_socket

编译,安装:

1
2
make
make install

该包有测试,但需要一些不安装的依赖。
创建一个符号链接:

ln -sfv /etc/machine-id /var/lib/dbus

Man-DB-2.9.4

1
2
tar -xvf man-db-2.9.4.tar.xz
cd man-db-2.9.4

cofigure

1
2
3
4
5
6
7
8
./configure --prefix=/usr                        \
--docdir=/usr/share/doc/man-db-2.9.4 \
--sysconfdir=/etc \
--disable-setuid \
--enable-cache-owner=bin \
--with-browser=/usr/bin/lynx \
--with-vgrind=/usr/bin/vgrind \
--with-grap=/usr/bin/grap

编译,检查,安装:

1
2
3
make
make check
make install

Procps-ng-3.3.17

1
2
tar -xvf procps-ng-3.3.17.tar.xz
cd procps-3.3.17

这里解压出来的目录是procps-3.3.17,不是procps-ng-3.3.17
configure

1
2
3
4
5
./configure --prefix=/usr                            \
--docdir=/usr/share/doc/procps-ng-3.3.17 \
--disable-static \
--disable-kill \
--with-systemd

编译,测试,安装:

1
2
3
make
make check
make install

检查是可选的,且已知五项与 pkill 相关的测试可能失败。

Util-linux-2.37.2

1
2
tar -xvf util-linux-2.37.2.tar.xz
cd util-linux-2.37.2

configure

1
2
3
4
5
6
7
8
9
10
11
12
13
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime   \
--libdir=/usr/lib \
--docdir=/usr/share/doc/util-linux-2.37.2 \
--disable-chfn-chsh \
--disable-login \
--disable-nologin \
--disable-su \
--disable-setpriv \
--disable-runuser \
--disable-pylibmount \
--disable-static \
--without-python \
runstatedir=/run

编译:

make

测试(可选):

1
2
3
rm tests/ts/lsns/ioctl_ns
chown -Rv tester .
su tester -c "make -k check"

安装:

make install

E2fsprogs-1.46.4

1
2
tar -xvf e2fsprogs-1.46.4.tar.gz
cd e2fsprogs-1.46.4

创建build

1
2
mkdir -v build
cd build

configure

1
2
3
4
5
6
7
../configure --prefix=/usr           \
--sysconfdir=/etc \
--enable-elf-shlibs \
--disable-libblkid \
--disable-libuuid \
--disable-uuidd \
--disable-fsck

编译,测试,安装:

1
2
3
make
make check
make install

已知测试u_direct_io可能在一些系统上失败。
删除无用的静态库:

rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a

更新系统dir文件:

1
2
gunzip -v /usr/share/info/libext2fs.info.gz
install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info

安装额外文档(可选):

1
2
3
makeinfo -o      doc/com_err.info ../lib/et/com_err.texinfo
install -v -m644 doc/com_err.info /usr/share/info
install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info

efivar-37

这是 efibootmanager 的一个依赖。
下载连接:https://github.com/rhboot/efivar/releases/download/37/efivar-37.tar.bz2
需要补丁,连接:https://www.linuxfromscratch.org/patches/blfs/11.0/efivar-37-gcc_9-1.patch

1
2
3
4
5
tar -xvf efivar-37.tar.bz2
cp efivar-37-gcc_9-1.patch efivar-37
cd efivar-37
patch -Np1 -i efivar-37-gcc_9-1.patch
make install LIBDIR=/usr/lib

Popt-1.18

这是 efibootmanager 的一个依赖。
下载连接:http://ftp.rpm.org/popt/releases/popt-1.x/popt-1.18.tar.gz

1
2
3
4
5
tar -xvf popt-1.18.tar.gz
cd popt-1.18
./configure --prefix=/usr --disable-static
make
make install

efibootmgr-17

这是 GRUB 用于支持 UEFI 的一个依赖。需要单独从 BLFS 上下载。
下载连接:https://github.com/rhboot/efibootmgr/archive/17/efibootmgr-17.tar.gz

1
2
tar -xvf efibootmgr-17.tar.gz
cd efibootmgr-17

修复一个编译时会遇到的错误:

sed -e '/extern int efi_set_verbose/d' -i src/efibootmgr.c

编译,安装:

1
2
make EFIDIR=/boot/efi/EFI EFI_LOADER=grubx64.efi
make install EFIDIR=/boot/efi/EFI

FreeType-2.11.0

这也是一个 GRUB 的依赖……
而且虽然在 BLFS 里写着不是必须,但用 BLFS 的命令 configure 时会报错需要该字体。
下载连接:https://downloads.sourceforge.net/freetype/freetype-2.11.0.tar.xz

1
2
tar -xvf freetype-2.11.0.tar.xz
cd freetype-2.11.0

构建:

1
2
3
4
5
6
7
sed -ri "s:.*(AUX_MODULES.*valid):\1:" modules.cfg &&

sed -r "s:.*(#.*SUBPIXEL_RENDERING) .*:\1:" \
-i include/freetype/config/ftoption.h &&

./configure --prefix=/usr --enable-freetype-config --disable-static &&
make

安装:

make install

GRUB-2.06 带 UEFI 支持

这里需要一个字体文件。
下载连接:https://unifoundry.com/pub/unifont/unifont-13.0.06/font-builds/unifont-13.0.06.pcf.gz

1
2
tar -xvf grub-2.06.tar.xz
cd grub-2.06

安装字体:

1
2
mkdir -pv /usr/share/fonts/unifont &&
gunzip -c ../unifont-13.0.06.pcf.gz > /usr/share/fonts/unifont/unifont.pcf

取消编译用环境变量(虽然没设置):

unset {C,CPP,CXX,LD}FLAGS

configure

1
2
3
4
5
6
./configure --prefix=/usr        \
--sysconfdir=/etc \
--disable-efiemu \
--enable-grub-mkfont \
--with-platform=efi \
--disable-werror

编译:

make

安装:

1
2
make install
mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions

移除调试符号(可选)

毕竟大部分人都不会调试这些软件包吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
save_usrlib="$(cd /usr/lib; ls ld-linux*)
libc.so.6
libthread_db.so.1
libquadmath.so.0.0.0
libstdc++.so.6.0.29
libitm.so.1.0.0
libatomic.so.1.2.0"

cd /usr/lib

for LIB in $save_usrlib; do
objcopy --only-keep-debug $LIB $LIB.dbg
cp $LIB /tmp/$LIB
strip --strip-unneeded /tmp/$LIB
objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
install -vm755 /tmp/$LIB /usr/lib
rm /tmp/$LIB
done

online_usrbin="bash find strip"
online_usrlib="libbfd-2.37.so
libhistory.so.8.1
libncursesw.so.6.2
libm.so.6
libreadline.so.8.1
libz.so.1.2.11
$(cd /usr/lib; find libnss*.so* -type f)"

for BIN in $online_usrbin; do
cp /usr/bin/$BIN /tmp/$BIN
strip --strip-unneeded /tmp/$BIN
install -vm755 /tmp/$BIN /usr/bin
rm /tmp/$BIN
done

for LIB in $online_usrlib; do
cp /usr/lib/$LIB /tmp/$LIB
strip --strip-unneeded /tmp/$LIB
install -vm755 /tmp/$LIB /usr/lib
rm /tmp/$LIB
done

for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \
$(find /usr/lib -type f -name \*.a) \
$(find /usr/{bin,sbin,libexec} -type f); do
case "$online_usrbin $online_usrlib $save_usrlib" in
*$(basename $i)* )
;;
* ) strip --strip-unneeded $i
;;
esac
done

unset BIN LIB save_usrlib online_usrbin online_usrlib

该命令会报错一堆文件格式无法识别,可以安全忽略。

清理

现在所有包都安装完成了。是时候清理了。

rm -rf /tmp/*

然后登出,重新 chroot:

logout
1
2
3
4
5
chroot "$LFS" /usr/bin/env -i          \
HOME=/root TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/usr/bin:/usr/sbin \
/bin/bash --login

这次 chroot 参数有点变化,之后 chroot 都需要执行现在改过的命令。
接着清理:

1
2
find /usr/lib /usr/libexec -name \*.la -delete
find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf

最后,移除用户tester

userdel -r tester

至此,系统构建部分正式结束。

作者

William Gong

发布于

2021-12-02

更新于

2024-03-05

许可协议