清理工作

构建任务已经完成,下面一起清理以下调试符号和无用内容。

4.4.1 移除调试符号

这个部分是可选的。如果预期的用户不是一个程序员或者不打算对系统软件进行任何调试,通过从二进制文件和库中删除调试符号能减少 90MB 的系统大小。除了不能完全调试软件,这不会导致任何不便。

默认情况下大多数程序和库的编译带有调试符号。(类似 gcc 的 -g 选项。)这意味着当你调试一个包含调试信息的已编译的程序或库时,调试程序不仅能提供内存地址,还能提供变量和实例的名字。

然而,包含这些调试符号明显的增大了程序或库。下面这个例子说明了这些符号有多么占地方:

  • 有调试符号的二进制 bash:1200 KB
  • 无调试符号的二进制 bash:480 KB
  • 有调试符号的 glibc 和 gcc 文件(/lib 和 /usr/lib):87 MB
  • 无调试符号的 glibc 和 gcc 文件:16 MB

大小可能会因为所使用的编译器和 C 语言库的不同而改变,但是当比较有无调试符号的程序时,大小可能相差 2-5 倍。

因为大多数用户从来不会在他们的系统软件上使用调试器,没了这些调试符号可以省下很多磁盘空间。

注意:运行下面的命令非常简单,很多人往往顺手就复制粘贴运行了。然而这步是非常容易发生问题的,严重的甚至会导致新系统无法使用,因此在运行 strip 命令之前,对当前状态的 LFS 系统进行备份是个好主意。当然如果空间足够甚至可以跳过清理的步骤。

首先将选定库的调试符号文件分开放置。如果要在后续的 BLFS 中用 valgrind 或 gdb 做回归测试,那么调试信息还有用武之地。

save_lib="ld-2.32.so libc-2.32.so libpthread-2.32.so libthread_db-1.0.so"

cd /lib

for LIB in $save_lib; do
    objcopy --only-keep-debug $LIB $LIB.dbg
    strip --strip-unneeded $LIB
    objcopy --add-gnu-debuglink=$LIB.dbg $LIB
done

save_usrlib="libquadmath.so.0.0.0 libstdc++.so.6.0.28
             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
    strip --strip-unneeded $LIB
    objcopy --add-gnu-debuglink=$LIB.dbg $LIB
done

unset LIB save_lib save_usrlib

移除程序和库的调试符号:

find /usr/lib -type f -name \*.a \
   -exec strip --strip-debug {} ';'

find /lib /usr/lib -type f -name \*.so* ! -name \*dbg \
   -exec strip --strip-unneeded {} ';'

find /{bin,sbin} /usr/{bin,sbin,libexec} -type f \
    -exec strip --strip-all {} ';'

运行上述命令会产生大量警告,因为许多文件的格式无法被识别。完全可以忽略这些警告,他们只是表示这些文件是脚本不是二进制文件而已。

4.4.2 清理系统

最后,清除运行测试留下来的多余文件:

rm -rf /tmp/*

现在,登出后用以下新的 chroot 命令重新进入 chroot 环境。在此以后当需要进入 chroot 环境时,都是用这个新的 chroot 命令:

logout

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

这样做的原因是不再需要 /tools 中的程序。因此你可以删除 /tools 目录。 移除 /tools 也会删除用于运行工具链测试的 Tcl、Expect 和 DejaGNU 的临时复制。如果你在后续还需要这些程序,需要重新编译并安装它们。BLFS 手册有关于这些的指令(请查看 http://www.linuxfromscratch.org/blfs/)。 如果通过手动或者重启卸载了虚拟内核文件系统,重新进入 chroot 的时候确保挂载了虚拟内核文件系统。在 3.4 中介绍了该过程。 还有一些此章之前为了一些软件包的回归测试而留下的静态库。这些库来自于 binutils、Bzip2、e2fsprogs、Flex、libtool 和 zlib。运行以下命令删除:

rm -f /usr/lib/lib{bfd,opcodes}.a
rm -f /usr/lib/libbz2.a
rm -f /usr/lib/lib{com_err,e2p,ext2fs,ss}.a
rm -f /usr/lib/libltdl.a
rm -f /usr/lib/libfl.a
rm -f /usr/lib/libz.a

还有几个安装在/usr/lib 和/usr/libexec 目录下的文件,文件的扩展名为.la。这些是 libtool 的归档文件,在 Linux 系统中通常不需要它们。这些都是没有必要的东西。运行以下命令删除:

find /usr/lib /usr/libexec -name \*.la -delete