source: chapter05/gcc-pass2.xml@ 908077d

10.0 10.0-rc1 10.1 10.1-rc1 11.0 11.0-rc1 11.0-rc2 11.0-rc3 11.1 11.1-rc1 11.2 11.2-rc1 11.3 11.3-rc1 12.0 12.0-rc1 12.1 12.1-rc1 7.4 7.5 7.6 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 9.0 9.1 arm bdubbs/gcc13 ml-11.0 multilib renodr/libudev-from-systemd s6-init trunk xry111/arm64 xry111/arm64-12.0 xry111/clfs-ng xry111/lfs-next xry111/loongarch xry111/loongarch-12.0 xry111/loongarch-12.1 xry111/mips64el xry111/pip3 xry111/rust-wip-20221008 xry111/update-glibc
Last change on this file since 908077d was 908077d, checked in by Matthew Burgess <matthew@…>, 11 years ago

Upgrade to GCC-4.8.0. Fixes #3312.

git-svn-id: http://svn.linuxfromscratch.org/LFS/trunk/BOOK@10220 4aa44e1e-78dd-0310-a6d2-fbcd4c07a689

  • Property mode set to 100644
File size: 10.6 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-tools-gcc-pass2" role="wrap">
9 <?dbhtml filename="gcc-pass2.html"?>
10
11 <sect1info condition="script">
12 <productname>gcc</productname>
13 <productnumber>&gcc-version;</productnumber>
14 <address>&gcc-url;</address>
15 </sect1info>
16
17 <title>GCC-&gcc-version; - Pass 2</title>
18
19 <indexterm zone="ch-tools-gcc-pass2">
20 <primary sortas="a-GCC">GCC</primary>
21 <secondary>tools, pass 2</secondary>
22 </indexterm>
23
24 <sect2 role="package">
25 <title/>
26
27 <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
28 href="../chapter06/gcc.xml"
29 xpointer="xpointer(/sect1/sect2[1]/para[1])"/>
30
31 <segmentedlist>
32 <segtitle>&buildtime;</segtitle>
33 <segtitle>&diskspace;</segtitle>
34
35 <seglistitem>
36 <seg>&gcc-ch5p2-sbu;</seg>
37 <seg>&gcc-ch5p2-du;</seg>
38 </seglistitem>
39 </segmentedlist>
40
41 </sect2>
42
43 <sect2 role="installation">
44 <title>Installation of GCC</title>
45
46 <para>Our first build of GCC has installed a couple of internal system
47 headers. Normally one of them, <filename>limits.h</filename> will in turn
48 include the corresponding system <filename>limits.h</filename> header, in
49 this case, <filename>/tools/include/limits.h</filename>. However, at the
50 time of the first build of gcc <filename>/tools/include/limits.h</filename>
51 did not exist, so the internal header that GCC installed is a partial,
52 self-contained file and does not include the extended features of the
53 system header. This was adequate for building the temporary libc, but this
54 build of GCC now requires the full internal header. Create a full version
55 of the internal header using a command that is identical to what the GCC
56 build system does in normal circumstances:</para>
57
58<screen><userinput remap="pre">cat gcc/limitx.h gcc/glimits.h gcc/limity.h &gt; \
59 `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h</userinput></screen>
60
61 <para>For x86 machines, a bootstrap build of GCC uses the
62 <option>-fomit-frame-pointer</option> compiler flag. Non-bootstrap builds
63 omit this flag by default, and the goal should be to produce a compiler
64 that is exactly the same as if it were bootstrapped. Apply the following
65 <command>sed</command> command to force the build to use the flag:</para>
66
67<screen><userinput remap="pre">cp -v gcc/Makefile.in{,.tmp}
68sed 's/^T_CFLAGS =$/&amp; -fomit-frame-pointer/' gcc/Makefile.in.tmp \
69 &gt; gcc/Makefile.in</userinput></screen>
70
71 <para>Once again, change the location of GCC's default dynamic linker to
72 use the one installed in <filename
73 class="directory">/tools</filename>.</para>
74
75<screen><userinput remap="pre">for file in \
76 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
77do
78 cp -uv $file{,.orig}
79 sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&amp;@g' \
80 -e 's@/usr@/tools@g' $file.orig &gt; $file
81 echo '
82#undef STANDARD_STARTFILE_PREFIX_1
83#undef STANDARD_STARTFILE_PREFIX_2
84#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
85#define STANDARD_STARTFILE_PREFIX_2 ""' &gt;&gt; $file
86 touch $file.orig
87done</userinput></screen>
88
89 <para>As in the first build of GCC it requires the GMP, MPFR and MPC
90 packages. Unpack the tarballs and move them into the required directory
91 names:</para>
92
93<screen><userinput remap="pre">tar -Jxf ../mpfr-&mpfr-version;.tar.xz
94mv -v mpfr-&mpfr-version; mpfr
95tar -Jxf ../gmp-&gmp-version;.tar.xz
96mv -v gmp-&gmp-version; gmp
97tar -zxf ../mpc-&mpc-version;.tar.gz
98mv -v mpc-&mpc-version; mpc</userinput></screen>
99
100 <para>Again, do not build the .info files. They are not needed here and
101 are broken with the current version of <command>makeinfo</command>.</para>
102
103 <screen><userinput remap="pre">sed -i 's/BUILD_INFO=info/BUILD_INFO=/' gcc/configure</userinput></screen>
104
105 <para>Create a separate build directory again:</para>
106
107<screen><userinput remap="pre">mkdir -v ../gcc-build
108cd ../gcc-build</userinput></screen>
109
110 <para>Before starting to build GCC, remember to unset any environment
111 variables that override the default optimization flags.</para>
112
113 <para>Now prepare GCC for compilation:</para>
114
115<screen><userinput remap="configure">CC=$LFS_TGT-gcc \
116CXX=$LFS_TGT-g++ \
117AR=$LFS_TGT-ar \
118RANLIB=$LFS_TGT-ranlib \
119../gcc-&gcc-version;/configure \
120 --prefix=/tools \
121 --with-local-prefix=/tools \
122 --with-native-system-header-dir=/tools/include \
123 --enable-clocale=gnu \
124 --enable-shared \
125 --enable-threads=posix \
126 --enable-__cxa_atexit \
127 --enable-languages=c,c++ \
128 --disable-libstdcxx-pch \
129 --disable-multilib \
130 --disable-bootstrap \
131 --disable-libgomp \
132 --with-mpfr-include=$(pwd)/../gcc-&gcc-version;/mpfr/src \
133 --with-mpfr-lib=$(pwd)/mpfr/src/.libs</userinput></screen>
134
135 <variablelist>
136 <title>The meaning of the new configure options:</title>
137
138 <varlistentry>
139 <term><parameter>--enable-clocale=gnu</parameter></term>
140 <listitem>
141 <para>This option ensures the correct locale model is selected
142 for the C++ libraries under all circumstances. If the configure
143 script finds the <emphasis>de_DE</emphasis> locale installed,
144 it will select the correct gnu locale model. However, if the
145 <emphasis>de_DE</emphasis> locale is not installed, there is the
146 risk of building Application Binary Interface (ABI)-incompatible
147 C++ libraries because the incorrect generic locale model may be
148 selected.</para>
149 </listitem>
150 </varlistentry>
151
152 <varlistentry>
153 <term><parameter>--enable-threads=posix</parameter></term>
154 <listitem>
155 <para>This enables C++ exception handling for multi-threaded code.</para>
156 </listitem>
157 </varlistentry>
158
159 <varlistentry>
160 <term><parameter>--enable-__cxa_atexit</parameter></term>
161 <listitem>
162 <para>This option allows use of <function>__cxa_atexit</function>,
163 rather than <function>atexit</function>, to register C++ destructors
164 for local statics and global objects. This option is essential for
165 fully standards-compliant handling of destructors. It also affects
166 the C++ ABI, and therefore results in C++ shared libraries and C++
167 programs that are interoperable with other Linux distributions.</para>
168 </listitem>
169 </varlistentry>
170
171 <varlistentry>
172 <term><parameter>--enable-languages=c,c++</parameter></term>
173 <listitem>
174 <para>This option ensures that both the C and C++ compilers are
175 built.</para>
176 </listitem>
177 </varlistentry>
178
179 <varlistentry>
180 <term><parameter>--disable-libstdcxx-pch</parameter></term>
181 <listitem>
182 <para>Do not build the pre-compiled header (PCH) for
183 <filename class="libraryfile">libstdc++</filename>. It takes up a
184 lot of space, and we have no use for it.</para>
185 </listitem>
186 </varlistentry>
187
188 <varlistentry>
189 <term><parameter>--disable-bootstrap</parameter></term>
190 <listitem>
191 <para>For native builds of GCC, the default is to do a "bootstrap"
192 build. This does not just compile GCC, but compiles it several times.
193 It uses the programs compiled in a first round to compile itself a
194 second time, and then again a third time. The second and third
195 iterations are compared to make sure it can reproduce itself
196 flawlessly. This also implies that it was compiled correctly.
197 However, the LFS build method should provide a solid compiler
198 without the need to bootstrap each time.</para>
199 </listitem>
200 </varlistentry>
201
202 </variablelist>
203
204 <para>Compile the package:</para>
205
206<screen><userinput remap="make">make</userinput></screen>
207
208 <para>Install the package:</para>
209
210<screen><userinput remap="install">make install</userinput></screen>
211
212 <para>As a finishing touch, create a symlink. Many programs and scripts
213 run <command>cc</command> instead of <command>gcc</command>, which is
214 used to keep programs generic and therefore usable on all kinds of UNIX
215 systems where the GNU C compiler is not always installed. Running
216 <command>cc</command> leaves the system administrator free to decide
217 which C compiler to install:</para>
218
219<screen><userinput remap="install">ln -sv gcc /tools/bin/cc</userinput></screen>
220
221 <caution>
222 <para>At this point, it is imperative to stop and ensure that the basic
223 functions (compiling and linking) of the new toolchain are working as
224 expected. To perform a sanity check, run the following commands:</para>
225
226<screen><userinput>echo 'main(){}' &gt; dummy.c
227cc dummy.c
228readelf -l a.out | grep ': /tools'</userinput></screen>
229
230 <para>If everything is working correctly, there should be no errors,
231 and the output of the last command will be of the form:</para>
232
233<screen><computeroutput>[Requesting program interpreter: /tools/lib/ld-linux.so.2]</computeroutput></screen>
234
235 <para>Note that <filename class="directory">/tools/lib</filename>, or
236 <filename class="directory">/tools/lib64</filename> for 64-bit machines
237 appears as the prefix of the dynamic linker.</para>
238
239 <para>If the output is not shown as above or there was no output at all,
240 then something is wrong. Investigate and retrace the steps to find out
241 where the problem is and correct it. This issue must be resolved before
242 continuing on. First, perform the sanity check again, using
243 <command>gcc</command> instead of <command>cc</command>. If this works,
244 then the <filename class="symlink">/tools/bin/cc</filename> symlink is
245 missing. Install the symlink as per above.
246 Next, ensure that the <envar>PATH</envar> is correct. This
247 can be checked by running <command>echo $PATH</command> and verifying that
248 <filename class="directory">/tools/bin</filename> is at the head of the
249 list. If the <envar>PATH</envar> is wrong it could mean that you are not
250 logged in as user <systemitem class="username">lfs</systemitem> or that
251 something went wrong back in <xref linkend="ch-tools-settingenviron"
252 role="."/></para>
253
254 <para>Once all is well, clean up the test files:</para>
255
256<screen><userinput>rm -v dummy.c a.out</userinput></screen>
257
258 </caution>
259
260 </sect2>
261
262 <sect2 role="content">
263 <title/>
264
265 <para>Details on this package are located in
266 <xref linkend="contents-gcc" role="."/></para>
267
268 </sect2>
269
270</sect1>
Note: See TracBrowser for help on using the repository browser.