aboutsummaryrefslogtreecommitdiffstats
path: root/chapter08/stripping.xml
blob: b7b983d73e29028f8fd734b39a19b22ca85fecb5 (plain)
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?xml version="1.0" encoding="ISO-8859-1"?>
<!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-stripping">
  <?dbhtml filename="stripping.html"?>

  <title>Stripping</title>

  <para>This section is optional.  If the intended user is not a
  programmer and does not plan to do
  any debugging of the system software, the system's size can be decreased
  by some 2 GB by removing the debugging symbols, and some unnecessary symbol table
  entries, from binaries and libraries. This causes no real inconvenience for
  a typical Linux user.</para>

  <para>Most people who use the commands mentioned below do not
  experience any difficulties. However, it is easy to make a mistake 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>A <command>strip</command> command with the
  <parameter>--strip-unneeded</parameter> option removes all debug symbols
  from a binary or library.  It also removes all symbol table entries not
  needed by the linker (for static libraries) or dynamic linker (for
  dynamically linked binaries and shared libraries).</para>

  <!-- TODO: Zstd is better than Zlib for both speed and size.
             Unfortunately Valgrind does not support Zstd-compressed debug
             info yet: https://bugs.kde.org/show_bug.cgi?id=469782 -->
  <para>The debugging symbols from selected libraries are compressed with
  <application>Zlib</application> and preserved in separate files.  That
  debugging information is needed to run regression tests with <ulink
  url='&blfs-book;/general/valgrind.html'>valgrind</ulink> or <ulink
  url='&blfs-book;/general/gdb.html'>gdb</ulink> later, in BLFS.
  </para>

  <para>Note that <command>strip</command> will overwrite the binary or library
  file it is processing.  This can crash the processes using code or data from
  the file.  If the process running <command>strip</command> is
  affected, the binary or library being stripped can be destroyed; this can
  make the system completely unusable.  To avoid this problem we copy some libraries
  and binaries into <filename class="directory">/tmp</filename>, strip them
  there, then reinstall them with the <command>install</command> command.
  (The related entry in <xref linkend="pkgmgmt-upgrade-issues"/> gives the
  rationale for using the <command>install</command> command here.)</para>

  <note><para>The ELF loader's name is ld-linux-x86-64.so.2 on 64-bit systems
  and ld-linux.so.2 on 32-bit systems.  The construct below selects the
  correct name for the current architecture, excluding anything ending
  with <quote>g</quote>, in case the commands below have already been
  run.</para></note>

  <important>
    <para>
      If there is any package whose version is different from the version
      specified by the book (either following a security advisory or
      satisfying personal preference), it may be necessary to update the
      library file name in <envar>save_usrlib</envar> or
      <envar>online_usrlib</envar>.
      <emphasis role='bold'>Failing to do so may render the system
      completely unusable.</emphasis>
    </para>
  </important>

<!-- 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_usrlib="$(cd /usr/lib; ls ld-linux*[^g])
             libc.so.6
             libthread_db.so.1
             libquadmath.so.&libquadmath-version;
             libstdc++.so.&libstdcpp-version;
             libitm.so.&libitm-version;
             libatomic.so.&libatomic-version;"

cd /usr/lib

for LIB in $save_usrlib; do
    objcopy --only-keep-debug --compress-debug-sections=zlib $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-&binutils-version;.so
               libsframe.so.&libsframe-version;
               libhistory.so.&readline-soversion;
               libncursesw.so.&ncurses-version;
               libm.so.6
               libreadline.so.&readline-soversion;
               libz.so.&zlib-version;
               libzstd.so.&zstd-version;
               $(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
</userinput></screen>

  <para>A large number of files will be flagged as errors because their file
  format is not recognized. These warnings can be safely ignored. They
  indicate that those files are scripts, not binaries.</para>

</sect1>