source: chapter08/stripping.xml@ d8521f6

multilib
Last change on this file since d8521f6 was d8521f6, checked in by Thomas Trepl <thomas@…>, 16 months ago

Automatic merge of trunk into multilib

  • Property mode set to 100644
File size: 6.8 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
4 <!ENTITY % general-entities SYSTEM "../general.ent">
5 %general-entities;
6]>
7
8<sect1 id="ch-system-stripping">
9 <?dbhtml filename="stripping.html"?>
10
11 <title>Stripping</title>
12
13 <para>This section is optional. If the intended user is not a
14 programmer and does not plan to do
15 any debugging of the system software, the system's size can be decreased
16 by some 2 GB by removing the debugging symbols, and some unnecessary symbol table
17 entries, from binaries and libraries. This causes no real inconvenience for
18 a typical Linux user.</para>
19
20 <para>Most people who use the commands mentioned below do not
21 experience any difficulties. However, it is easy to make a mistake and
22 render the new system unusable. So before running the
23 <command>strip</command> commands, it is a good idea to make a
24 backup of the LFS system in its current state.</para>
25
26 <para>A <command>strip</command> command with the
27 <parameter>--strip-unneeded</parameter> option removes all debug symbols
28 from a binary or library. It also removes all symbol table entries not
29 needed by the linker (for static libraries) or dynamic linker (for
30 dynamically linked binaries and shared libraries).</para>
31
32 <para>The debugging symbols from selected libraries are preserved
33 in separate files. That debugging information is needed to run
34 regression tests with <ulink
35 url='&blfs-book;/general/valgrind.html'>valgrind</ulink> or <ulink
36 url='&blfs-book;/general/gdb.html'>gdb</ulink> later, in BLFS.
37 </para>
38
39 <para>Note that <command>strip</command> will overwrite the binary or library
40 file it is processing. This can crash the processes using code or data from
41 the file. If the process running <command>strip</command> is
42 affected, the binary or library being stripped can be destroyed; this can
43 make the system completely unusable. To avoid this problem we copy some libraries
44 and binaries into <filename class="directory">/tmp</filename>, strip them
45 there, then reinstall them with the <command>install</command> command.
46 (The related entry in <xref linkend="pkgmgmt-upgrade-issues"/> gives the
47 rationale for using the <command>install</command> command here.)</para>
48
49 <note><para>The ELF loader's name is ld-linux-x86-64.so.2 on 64-bit systems
50 and ld-linux.so.2 on 32-bit systems. The construct below selects the
51 correct name for the current architecture, excluding anything ending
52 with <quote>g</quote>, in case the commands below have already been
53 run.</para></note>
54
55 <important>
56 <para>
57 If any package of which the version is different from the version
58 specified by the book (either following a security advisory or
59 satisfying personal preference), it may be necessary to update the
60 the library file name in <envar>save_usrlib</envar> or
61 <envar>online_usrlib</envar>.
62 <emphasis role='bold'>Failing to do so may render the system
63 completely unusable.</emphasis>
64 </para>
65 </important>
66
67<!-- also of interest are libgfortan, libgo, libgomp, and libobjc from GCC -->
68
69<!--<screen><userinput>save_lib="ld-2.25.so libc-2.25.so libpthread-2.25.so libthread_db-1.0.so"-->
70<screen><userinput>save_usrlib="$(cd /usr/lib; ls ld-linux*[^g])
71 libc.so.6
72 libthread_db.so.1
73 libquadmath.so.&libquadmath-version;
74 libstdc++.so.&libstdcpp-version;
75 libitm.so.&libitm-version;
76 libatomic.so.&libatomic-version;"
77
78cd /usr/lib
79for LIB in $save_usrlib; do
80 objcopy --only-keep-debug $LIB $LIB.dbg
81 cp $LIB /tmp/$LIB
82 strip --strip-unneeded /tmp/$LIB
83 objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
84 install -vm755 /tmp/$LIB /usr/lib
85 rm /tmp/$LIB
86done</userinput>
87<userinput arch="ml_32,ml_all">
88cd /usr/lib32
89for LIB in $save_usrlib; do
90 objcopy --only-keep-debug $LIB $LIB.dbg
91 cp $LIB /tmp/$LIB
92 strip --strip-unneeded /tmp/$LIB
93 objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
94 install -vm755 /tmp/$LIB /usr/lib32
95 rm /tmp/$LIB
96done</userinput>
97<userinput arch="ml_x32,ml_all">
98cd /usr/libx32
99for LIB in $save_usrlib; do
100 objcopy --only-keep-debug $LIB $LIB.dbg
101 cp $LIB /tmp/$LIB
102 strip --strip-unneeded /tmp/$LIB
103 objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
104 install -vm755 /tmp/$LIB /usr/libx32
105 rm /tmp/$LIB
106done</userinput><userinput>
107
108online_usrbin="bash find strip"
109online_usrlib="libbfd-&binutils-version;.so
110 libsframe.so.0.0.0
111 libhistory.so.&readline-soversion;
112 libncursesw.so.&ncurses-version;
113 libm.so.6
114 libreadline.so.&readline-soversion;
115 libz.so.&zlib-version;
116 $(cd /usr/lib; find libnss*.so* -type f)"
117
118for BIN in $online_usrbin; do
119 cp /usr/bin/$BIN /tmp/$BIN
120 strip --strip-unneeded /tmp/$BIN
121 install -vm755 /tmp/$BIN /usr/bin
122 rm /tmp/$BIN
123done
124
125for LIB in $online_usrlib; do
126 cp /usr/lib/$LIB /tmp/$LIB
127 strip --strip-unneeded /tmp/$LIB
128 install -vm755 /tmp/$LIB /usr/lib
129 rm /tmp/$LIB
130done</userinput><userinput arch="ml_32,ml_all">
131for LIB in $online_usrlib; do
132 cp /usr/lib32/$LIB /tmp/$LIB
133 strip --strip-unneeded /tmp/$LIB
134 install -vm755 /tmp/$LIB /usr/lib32
135 rm /tmp/$LIB
136done</userinput><userinput arch="ml_x32,ml_all">
137for LIB in $online_usrlib; do
138 cp /usr/libx32/$LIB /tmp/$LIB
139 strip --strip-unneeded /tmp/$LIB
140 install -vm755 /tmp/$LIB /usr/libx32
141 rm /tmp/$LIB
142done</userinput><userinput>
143
144for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \
145 $(find /usr/lib -type f -name \*.a) \
146 $(find /usr/{bin,sbin,libexec} -type f); do
147 case "$online_usrbin $online_usrlib $save_usrlib" in
148 *$(basename $i)* )
149 ;;
150 * ) strip --strip-unneeded $i
151 ;;
152 esac
153done</userinput><userinput arch="ml_32,ml_all">
154for i in $(find /usr/lib32 -type f -name \*.so* ! -name \*dbg) \
155 $(find /usr/lib32 -type f -name \*.a); do
156 case "$online_usrbin $online_usrlib $save_usrlib" in
157 *$(basename $i)* )
158 ;;
159 * ) strip --strip-unneeded $i
160 ;;
161 esac
162done</userinput><userinput arch="ml_x32,ml_all">
163for i in $(find /usr/libx32 -type f -name \*.so* ! -name \*dbg) \
164 $(find /usr/libx32 -type f -name \*.a); do
165 case "$online_usrbin $online_usrlib $save_usrlib" in
166 *$(basename $i)* )
167 ;;
168 * ) strip --strip-unneeded $i
169 ;;
170 esac
171done</userinput><userinput>
172
173unset BIN LIB save_usrlib online_usrbin online_usrlib
174</userinput></screen>
175
176 <para>A large number of files will be flagged as errors because their file
177 format is not recognized. These warnings can be safely ignored. They
178 indicate that those files are scripts, not binaries.</para>
179
180</sect1>
Note: See TracBrowser for help on using the repository browser.