<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
  <!ENTITY % general-entities SYSTEM "../general.ent">
  %general-entities;
]>

<sect1 id="ch-system-strippingagain">
  <?dbhtml filename="strippingagain.html"?>

  <title>再次移除调试符号</title>

  <!--para>This section is optional.  If the intended user is not a 
  programmer and does not plan to do
  any debugging on the system software, the system size can be decreased
  by about 90 MB by removing the debugging symbols from binaries and
  libraries. This causes no inconvenience other than not being able to
  debug the software fully anymore.</para-->
  <para>本节是可选的。如果系统不是为程序员设计的，
	  也没有调试系统软件的计划，可以通过从二进制程序和库移除调试符号，
	  将系统的体积减小约 90 MB 。除了无法再调试全部软件外，
	  这不会造成任何不便。</para>

  <!--para>Most people who use the commands mentioned below do not
  experience any difficulties. However, it is easy to make a typo and
  render the new system unusable, so before running the
  <command>strip</command> commands, it is a good idea to make a
  backup of the LFS system in its current state.</para-->
  <para>大多数使用以下命令的用户不会遇到什么困难，但如果打错了命令，
	  很容易导致新系统无法使用。因此，在运行 <command>strip</command>
	  命令前，最好备份 LFS 系统的当前状态。</para>

  <!--para>First place the debugging symbols for selected libraries 
  in separate files.  This debugging information is needed if running 
  regression tests that use <ulink  -->
  <para>首先将一些库的调试符号保存在单独的文件中，在 BLFS 中，
  如果使用 <ulink
  url='&blfs-book;/general/valgrind.html'>valgrind</ulink> 或 <ulink 
  url='&blfs-book;/general/gdb.html'>gdb</ulink> 运行退化测试，
  则需要这些调试信息的存在。
  </para>

<!-- also of interest are libgfortan, libgo, libgomp, and libobjc from gcc -->

<!--<screen><userinput>save_lib="ld-2.25.so libc-2.25.so libpthread-2.25.so libthread_db-1.0.so"-->
<screen><userinput>save_lib="ld-&glibc-version;.so libc-&glibc-version;.so libpthread-&glibc-version;.so libthread_db-&libthread_db-version;.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.&libquadmath-version; libstdc++.so.&libstdcpp-version;
             libmpx.so.&libmpx-version; libmpxwrappers.so.&libmpxwrap-version; libitm.so.&libitm-version;
             libatomic.so.&libatomic-version;" <!-- libcilkrts.so.&libcilkrts-version;-->

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</userinput></screen>

  <!--para>Before performing the stripping, take special care to ensure that
  none of the binaries that are about to be stripped are running. If
  unsure whether the user entered chroot with the command given in
  <xref linkend="ch-system-chroot" role=","/> first exit from
  chroot:</para-->
  <para>在移除调试符号前，必须特别小心，
	  保证没有需要移除调试符号的二进制程序还在运行。
	  如果不确定是否使用 <xref linkend="ch-system-chroot"/>
	  中的命令进入了 chroot 环境，首先退出 chroot 环境：</para>

<screen role="nodump"><userinput>logout</userinput></screen>

  <para>然后再执行以下命令重新进入：</para>

<screen role="nodump"><userinput>chroot $LFS /tools/bin/env -i          \
    HOME=/root TERM=$TERM              \
    PS1='(lfs chroot) \u:\w\$ '        \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin \
    /tools/bin/bash --login</userinput></screen>

  <note><title>译注</title>
	  <para>注意这里使用了 /tools/bin/bash 而不是 /bin/bash ，
		  因为 /bin 中的 bash 二进制文件将会被移除调试符号。
		  在 <xref linkend="ch-system-bash"/> 中我们执行了新编译的
		  /bin/bash ，因此必须退出 chroot 环境，再以 /tools/bin/bash
		  为 shell 重新进入。之后使用的 /tools/bin/find 和
		  /tools/bin/strip 同理。</para>
  </note>

  <para>现在即可安全地移除程序和库的调试符号：</para>

<screen><userinput>/tools/bin/find /usr/lib -type f -name \*.a \
   -exec /tools/bin/strip --strip-debug {} ';'

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

/tools/bin/find /{bin,sbin} /usr/{bin,sbin,libexec} -type f \
    -exec /tools/bin/strip --strip-all {} ';'</userinput></screen>

  <!--para>A large number of files will be reported as having their file
  format not recognized. These warnings can be safely ignored. These
  warnings indicate that those files are scripts instead of
  binaries.</para-->
  <para>这里会有很多文件被报告为格式无法识别，这些警告可以安全地忽略。
	  它们表明那些文件是脚本文件，而不是二进制文件。</para>

</sect1>
