aboutsummaryrefslogtreecommitdiffstats
path: root/chapter07/stripping.xml
blob: da0bd3991a81d938650c78c54e1e2c542237e6a3 (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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
<?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-tools-stripping">
  <?dbhtml filename="stripping.html"?>

  <title>Cleaning up and Saving the Temporary System</title>
  
  <para>The libtool .la files are only useful when linking with static
  libraries. They are unneeded, and potentially harmful, when using dynamic
  shared libraries, specially when using non-autotools build systems.
  While still in chroot, remove those files now:</para>

<screen><userinput>find /usr/{lib,libexec} -name \*.la -delete</userinput></screen>

  <note><para>
    All the remaining steps in this section are optional. Nevertheless,
    as soon as you begin installing packages in <xref
    linkend="chapter-building-system"/>, the temporary tools will be
    overwritten. So it may be a good idea to do a backup of the temporary
    tools as described below. The other steps are only needed if you are
    really short on disk space.
  </para></note>

  <para>
    The following steps are performed from outside the chroot
    environment. That means, you have to leave the chroot environment
    first before continuing. The reason for that is to:
    <itemizedlist>
      <listitem>
        <para>
          make sure that objects are not in use while they are 
          manipulated.
        </para>
      </listitem>
      <listitem>
        <para>
          get access to file system locations outside of the chroot
          environment to store/read the backup archive which should
          not be placed within the
          <filename class="directory">$LFS</filename> hierarchy for
          safety reasons.
        </para>
      </listitem>
    </itemizedlist>
  </para>

  <para>
    Leave the chroot environment and unmount the kernel virtual file
    systems:
  </para>

  <note>
    <para>All of the following instructions are executed by
      <systemitem class="username">root</systemitem>. Take extra
      care about the commands you're going to run as mistakes
      here can modify your host system. Be aware that the
      environment variable <envar>LFS</envar> is set for user 
      <systemitem class="username">lfs</systemitem> by default 
      but it might <emphasis>not</emphasis> be set for 
      <systemitem class="username">root</systemitem>. Whenever 
      commands are to be executed by <systemitem class="username">root</systemitem>, 
      make sure you have set <envar>LFS</envar> accordingly.
      This has been discussed in <xref linkend='ch-partitioning-aboutlfs'/>.
    </para>
  </note>

<screen role="nodump"><userinput>exit
umount $LFS/dev{/pts,}
umount $LFS/{sys,proc,run}</userinput></screen>

  <sect2>
    <title>Stripping</title>

    <para>If the LFS partition is rather small, it is good to
    know that unnecessary items can be removed. The executables and
    libraries built so far contain a little over 90 MB of unneeded debugging
    symbols.</para>

    <para>Strip off debugging symbols from binaries:</para>
<screen role="nodump"><userinput>strip --strip-debug $LFS/usr/lib/*
strip --strip-unneeded $LFS/usr/{,s}bin/*
strip --strip-unneeded $LFS/tools/bin/*</userinput></screen>

    <para>These commands will skip a number of files reporting that it does not
    recognize their file format. Most of these are scripts instead of binaries.
    <!--Note that we use the <command>strip</command> program built in
    <quote>Binutils pass 2</quote>, since it is the one that knows how to strip
    our cross-compiled programs.--></para>

    <para>Take care <emphasis>NOT</emphasis> to use
    <parameter>--strip-unneeded</parameter> on the libraries. The static
    ones would be destroyed and the toolchain packages would need to be
    built all over again.</para>

    <para>To save more space (slightly more than 35 MB), remove the documentation:</para>

<screen role="nodump"><userinput>rm -rf $LFS/usr/share/{info,man,doc}</userinput></screen>

    <para>At this point, you should have at least 5 GB of free space on the
    chroot partition that can be used to build and install Glibc and GCC in
    the next phase. If you can build and install Glibc, you can build and install
    the rest too. You can check the free disk space with the command 
    <command>df -h $LFS</command>.</para>

  </sect2>

  <sect2>
    <title>Backup</title>

    <para>
      Now that the essential tools have been created, its time to think about
      a backup. When every check has passed successfully in the previously 
      built packages, your temporary tools are in a good state and might be
      backed up for later reuse. In case of fatal failures in the subsequent
      chapters, it often turns out that removing everything and starting over
      (more carefully) is the best option to recover. Unfortunately, all the
      temporary tools will be removed, too. To avoid spending extra time to
      redo something which has been built successfully, prepare a backup.
    </para>

    <para>
      Make sure you have at least 600 MB free disk space (the source tarballs
      will be included in the backup archive) in the home directory of user 
      <systemitem class="username">root</systemitem>.
    </para>

    <para>
      Create the backup archive by running the following command:
    </para>

<screen role="nodump" revision="sysv"><userinput>cd $LFS &amp;&amp;
tar -cJpf $HOME/lfs-temp-tools-&version;.tar.xz .</userinput></screen>

<screen role="nodump" revision="systemd"><userinput>cd $LFS &amp;&amp;
tar -cJpf $HOME/lfs-temp-tools-&versiond;.tar.xz .</userinput></screen>

    <para>
      Replace <envar>$HOME</envar> by a directory of your choice if you
      do not want to have the backup stored in <systemitem 
      class="username">root</systemitem>'s home directory.
    </para>
  </sect2>

  <sect2>
    <title>Restore</title>

    <para>
      In case some mistakes have been made and you need to start over, you can
      use this backup to restore the temporary tools and save some recovery time.
      Since the sources are located under 
      <filename class="directory">$LFS</filename>, they are included in the
      backup archive as well, so they do not need to be downloaded again. After
      checking that <envar>$LFS</envar> is set properly,
      restore the backup by executing the following commands:
    </para>

<!-- Make the following look different so users don't blindly run the
     restore when they don't need to. -->

<screen role="nodump" revision="sysv"><computeroutput>cd $LFS &amp;&amp;
rm -rf ./* &amp;&amp;
tar -xpf $HOME/lfs-temp-tools-&version;.tar.xz</computeroutput></screen>

<screen role="nodump" revision="systemd"><computeroutput>cd $LFS &amp;&amp;
rm -rf ./* &amp;&amp;
tar -xpf $HOME/lfs-temp-tools-&versiond;.tar.xz</computeroutput></screen>

    <para>
      Again, double check that the environment has been setup properly
      and continue building the rest of the system.
    </para>

    <important>
      <para>
        If you left the chroot environment either to strip off debug
        symbols, create a backup, or restart building using a restore, 
        remember to mount the kernel virtual filesystems now again as 
        described in <xref linkend='ch-tools-kernfs'/> and re-enter
        the chroot environment (see <xref linkend='ch-tools-chroot'/>)
        again before continuing.
      </para>
    </important>
    
  </sect2>

</sect1>