source: chapter05/gcc-pass2.xml@ 4e82d47

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 6.5 6.6 6.7 6.8 7.0 7.1 7.2 7.3 7.4 7.5 7.5-systemd 7.6 7.6-systemd 7.7 7.7-systemd 7.8 7.8-systemd 7.9 7.9-systemd 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 4e82d47 was 4e82d47, checked in by Jeremy Huntwork <jhuntwork@…>, 15 years ago

Bring in DIY's next generation build method. Move GRUB to chapter 8.

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

  • Property mode set to 100644
File size: 11.7 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/2003/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>Versions of GCC later than 4.3 will treat this build as if
47 it were a relocated compiler and disallow searching for startfiles in
48 the location specified by <parameter>--prefix</parameter>. Since this
49 will not be a relocated compiler, and the startfiles in
50 <filename class="directory">/tools</filename> are crucial to building
51 a working compiler linked to the libs in <filename class="directory">/tools</filename>,
52 apply the following patch which partially reverts GCC to its old behavior:</para>
53
54<screen><userinput remap="pre">patch -Np1 -i ../&gcc-startfiles-patch;</userinput></screen>
55
56 <para>Under normal circumstances the GCC <command>fixincludes</command> script
57 is run in order to fix potentially broken header files. As GCC-&gcc-version;
58 and Glibc-&glibc-version; have already been installed at this point, and
59 their respective header files are known to not require fixing, the
60 <command>fixincludes</command> script is not required. As mentioned
61 previously, the script may in fact pollute the build environment by
62 installing fixed headers from the host system into GCC's private include
63 directory. The running of the <command>fixincludes</command> script can
64 be suppressed by issuing the following commands:</para>
65
66<screen><userinput remap="pre">cp -v gcc/Makefile.in{,.orig}
67sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig &gt; gcc/Makefile.in</userinput></screen>
68
69 <para>Non-bootstrap builds omit the <option>-fomit-frame-pointer</option>
70 build flag by default, and the goal should be to produce a compiler that is
71 exactly the same as if it were bootstrapped. Apply the following
72 <command>sed</command> command to force the build to use the flag:</para>
73
74<screen><userinput remap="pre">cp -v gcc/Makefile.in{,.tmp}
75sed 's/^XCFLAGS =$/&amp; -fomit-frame-pointer/' gcc/Makefile.in.tmp \
76 &gt; gcc/Makefile.in</userinput></screen>
77
78 <para>The following command will change the location of GCC's default
79 dynamic linker to use the one installed in
80 <filename class="directory">/tools</filename>. It also removes <filename
81 class="directory">/usr/include</filename> from GCC's include search path.
82 Doing this now rather than adjusting the specs file after installation
83 ensures that the new dynamic linker is used during the actual build of
84 GCC. That is, all of the binaries created during the build will link
85 against the new Glibc. Issue:</para>
86
87<screen><userinput remap="pre">for file in \
88 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
89do
90 cp -uv $file{,.orig}
91 sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&amp;@g' \
92 -e 's@/usr@/tools@g' $file.orig &gt; $file
93 echo '
94#undef STANDARD_INCLUDE_DIR
95#define STANDARD_INCLUDE_DIR 0
96#define STANDARD_STARTFILE_PREFIX_1 ""
97#define STANDARD_STARTFILE_PREFIX_2 ""' &gt;&gt; $file
98 touch $file.orig
99done</userinput></screen>
100
101 <para>In case the above seems hard to follow, let's break it down a bit.
102 First we find all the files under the gcc/config directory that are named
103 either <filename>linux.h</filename>, <filename>linux64.h</filename> or
104 <filename>sysv4.h</filename>.
105 For each file found, we copy it to a file of the same name but with an added
106 suffix of <quote>.orig</quote>. Then the first sed expression prepends
107 <quote>/tools</quote> to every instance of <quote>/lib/ld</quote>,
108 <quote>/lib64/ld</quote> or <quote>/lib32/ld</quote>, while the second one
109 replaces hard-coded instances of <quote>/usr</quote>. Then we add our define
110 statements which alter the include search path and the default startfile prefix
111 to the end of the file.
112 Finally, we use <command>touch</command> to update the timestamp on the copied files.
113 When used in conjunction with <command>cp -u</command>, this prevents unexpected
114 changes to the original files in case the command is inadvertently run twice.
115 </para>
116
117 <para>On x86_64, unsetting the multlib spec for GCC ensures that it
118 won't attempt to link against libraries on the host:</para>
119
120<screen><userinput remap="pre">case $(uname -m) in
121 x86_64)
122 for file in $(find gcc/config -name t-linux64) ; do \
123 cp -v $file{,.orig}
124 sed '/MULTILIB_OSDIRNAMES/d' $file.orig &gt; $file
125 done
126 ;;
127esac</userinput></screen>
128
129 <para>As in the first build of GCC it requires the GMP and MPFR packages.
130 Unpack the tarballs and move them into the required directory names:</para>
131
132<screen><userinput remap="pre">tar -jxf ../mpfr-&mpfr-version;.tar.bz2
133mv mpfr-&mpfr-version; mpfr
134tar -jxf ../gmp-&gmp-version;.tar.bz2
135mv gmp-&gmp-version; gmp</userinput></screen>
136
137 <para>Create a separate build directory again:</para>
138
139<screen><userinput remap="pre">mkdir -v ../gcc-build
140cd ../gcc-build</userinput></screen>
141
142 <para>Before starting to build GCC, remember to unset any environment
143 variables that override the default optimization flags.</para>
144
145 <para>Now prepare GCC for compilation:</para>
146
147<screen><userinput remap="configure">CC="$LFS_TGT-gcc -B/tools/lib/" \
148 AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib \
149 ../gcc-&gcc-version;/configure --prefix=/tools \
150 --with-local-prefix=/tools --enable-clocale=gnu \
151 --enable-shared --enable-threads=posix \
152 --enable-__cxa_atexit --enable-languages=c,c++ \
153 --disable-libstdcxx-pch --disable-multilib \
154 --disable-bootstrap</userinput></screen>
155
156 <variablelist>
157 <title>The meaning of the new configure options:</title>
158
159 <varlistentry>
160 <term><parameter>--enable-clocale=gnu</parameter></term>
161 <listitem>
162 <para>This option ensures the correct locale model is selected
163 for the C++ libraries under all circumstances. If the configure
164 script finds the <emphasis>de_DE</emphasis> locale installed,
165 it will select the correct gnu locale model. However, if the
166 <emphasis>de_DE</emphasis> locale is not installed, there is the
167 risk of building Application Binary Interface (ABI)-incompatible
168 C++ libraries because the incorrect generic locale model may be
169 selected.</para>
170 </listitem>
171 </varlistentry>
172
173 <varlistentry>
174 <term><parameter>--enable-threads=posix</parameter></term>
175 <listitem>
176 <para>This enables C++ exception handling for multi-threaded code.</para>
177 </listitem>
178 </varlistentry>
179
180 <varlistentry>
181 <term><parameter>--enable-__cxa_atexit</parameter></term>
182 <listitem>
183 <para>This option allows use of <function>__cxa_atexit</function>,
184 rather than <function>atexit</function>, to register C++ destructors
185 for local statics and global objects. This option is essential for
186 fully standards-compliant handling of destructors. It also affects
187 the C++ ABI, and therefore results in C++ shared libraries and C++
188 programs that are interoperable with other Linux distributions.</para>
189 </listitem>
190 </varlistentry>
191
192 <varlistentry>
193 <term><parameter>--enable-languages=c,c++</parameter></term>
194 <listitem>
195 <para>This option ensures that both the C and C++ compilers are
196 built.</para>
197 </listitem>
198 </varlistentry>
199
200 <varlistentry>
201 <term><parameter>--disable-libstdcxx-pch</parameter></term>
202 <listitem>
203 <para>Do not build the pre-compiled header (PCH) for
204 <filename class="libraryfile">libstdc++</filename>. It takes up a
205 lot of space, and we have no use for it.</para>
206 </listitem>
207 </varlistentry>
208
209 <varlistentry>
210 <term><parameter>--disable-bootstrap</parameter></term>
211 <listitem>
212 <para>Bootstrapping the compiler is now the default for GCC. However,
213 our build method should provide us with a solid compiler without the
214 need to bootstrap each time.</para>
215 </listitem>
216 </varlistentry>
217
218 </variablelist>
219
220 <para>Compile the package:</para>
221
222<screen><userinput remap="make">make</userinput></screen>
223
224 <para>Install the package:</para>
225
226<screen><userinput remap="install">make install</userinput></screen>
227
228 <para>As a finishing touch, create a symlink. Many programs and scripts
229 run <command>cc</command> instead of <command>gcc</command>, which is
230 used to keep programs generic and therefore usable on all kinds of UNIX
231 systems where the GNU C compiler is not always installed. Running
232 <command>cc</command> leaves the system administrator free to decide
233 which C compiler to install:</para>
234
235<screen><userinput remap="install">ln -vs gcc /tools/bin/cc</userinput></screen>
236
237 <caution>
238 <para>At this point, it is imperative to stop and ensure that the basic
239 functions (compiling and linking) of the new toolchain are working as
240 expected. To perform a sanity check, run the following commands:</para>
241
242<screen><userinput>echo 'main(){}' &gt; dummy.c
243cc dummy.c
244readelf -l a.out | grep ': /tools'</userinput></screen>
245
246 <para>If everything is working correctly, there should be no errors,
247 and the output of the last command will be of the form:</para>
248
249<screen><computeroutput>[Requesting program interpreter:
250 /tools/lib/ld-linux.so.2]</computeroutput></screen>
251
252 <para>Note that <filename class="directory">/tools/lib</filename>, or
253 <filename class="directory">/tools/lib64</filename> for 64-bit machines
254 appears as the prefix of the dynamic linker.</para>
255
256 <para>If the output is not shown as above or there was no output at all,
257 then something is wrong. Investigate and retrace the steps to find out
258 where the problem is and correct it. This issue must be resolved before
259 continuing on. First, perform the sanity check again, using
260 <command>gcc</command> instead of <command>cc</command>. If this works,
261 then the <filename class="symlink">/tools/bin/cc</filename> symlink is
262 missing. Install the symlink as per above.
263 Next, ensure that the <envar>PATH</envar> is correct. This
264 can be checked by running <command>echo $PATH</command> and verifying that
265 <filename class="directory">/tools/bin</filename> is at the head of the
266 list. If the <envar>PATH</envar> is wrong it could mean that you are not
267 logged in as user <systemitem class="username">lfs</systemitem> or that
268 something went wrong back in <xref linkend="ch-tools-settingenviron"
269 role="."/></para>
270
271 <para>Once all is well, clean up the test files:</para>
272
273<screen><userinput>rm -v dummy.c a.out</userinput></screen>
274
275 </caution>
276
277 </sect2>
278
279 <sect2 role="content">
280 <title/>
281
282 <para>Details on this package are located in
283 <xref linkend="contents-gcc" role="."/></para>
284
285 </sect2>
286
287</sect1>
Note: See TracBrowser for help on using the repository browser.