source: chapter05/gcc-pass2.xml@ 8eb3fe4

multilib-10.1 multilib-before-cross
Last change on this file since 8eb3fe4 was 8eb3fe4, checked in by Thomas Trepl <thomas@…>, 3 years ago

First apply of multilib-patch of April 1st, 2019

git-svn-id: http://svn.linuxfromscratch.org/LFS/branches/multilib@11566 4aa44e1e-78dd-0310-a6d2-fbcd4c07a689

  • Property mode set to 100644
File size: 11.9 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, the limited number of registers is a bottleneck
62 for the system. Free one up by not using a frame pointer that is not
63 needed:</para>
64
65<screen><userinput remap="pre">case `uname -m` in
66 i?86) sed -i 's/^T_CFLAGS =$/&amp; -fomit-frame-pointer/' gcc/Makefile.in ;;
67esac</userinput></screen>
68-->
69 <para>Once again, change the location of GCC's default dynamic linker to
70 use the one installed in <filename
71 class="directory">/tools</filename>.</para>
72
73<screen><userinput remap="pre">for file in gcc/config/{linux,i386/linux{,64}}.h
74do
75 cp -uv $file{,.orig}
76 sed -e 's@/lib\(64\)\?\(32\)\?\(x32\)\?/ld@/tools&amp;@g' \
77 -e 's@/usr@/tools@g' $file.orig &gt; $file
78 echo '
79#undef STANDARD_STARTFILE_PREFIX_1
80#undef STANDARD_STARTFILE_PREFIX_2
81#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
82#define STANDARD_STARTFILE_PREFIX_2 ""' &gt;&gt; $file
83 touch $file.orig
84done</userinput></screen>
85
86 <para arch="default">If building on x86_64, change the default directory
87 name for 64-bit libraries to <quote>lib</quote>:</para>
88
89<screen arch="default"><userinput remap="pre">case $(uname -m) in
90 x86_64)
91 sed -e '/m64=/s/lib64/lib/' \
92 -i.orig gcc/config/i386/t-linux64
93 ;;
94esac</userinput></screen>
95
96 <para arch="multilib">Change the default directory name for 64-bit
97 libraries to <quote>lib</quote>:</para>
98
99<screen arch="multilib"><userinput remap="pre">sed -e '/m64=/s/lib64/lib/' \
100 -i.orig gcc/config/i386/t-linux64
101cat > gcc/config/i386/t-linux64 &lt;&lt;"EOF"
102comma=,
103MULTILIB_OPTIONS = $(subst $(comma),/,$(TM_MULTILIB_CONFIG))
104MULTILIB_DIRNAMES = $(patsubst m%, %, $(subst /, ,$(MULTILIB_OPTIONS)))
105MULTILIB_OSDIRNAMES = m64=../lib$(call if_multiarch,:x86_64-linux-gnu)
106MULTILIB_OSDIRNAMES+= m32=../lib32$(call if_multiarch,:i386-linux-gnu)
107MULTILIB_OSDIRNAMES+= mx32=../libx32$(call if_multiarch,:x86_64-linux-gnux32)
108EOF</userinput></screen>
109
110 <para arch="default">As in the first build of GCC it requires the GMP,
111 MPFR, and MPC packages. Unpack the tarballs and move them into the
112 required directory names:</para>
113
114 <para arch="multilib">As in the first build of GCC it requires the GMP,
115 ISL, MPFR, and MPC packages. Unpack the tarballs and move them into the
116 required directory names:</para>
117
118<screen arch="default"><userinput remap="pre">tar -xf ../mpfr-&mpfr-version;.tar.xz
119mv -v mpfr-&mpfr-version; mpfr
120tar -xf ../gmp-&gmp-version;.tar.xz
121mv -v gmp-&gmp-version; gmp
122tar -xf ../mpc-&mpc-version;.tar.gz
123mv -v mpc-&mpc-version; mpc</userinput></screen>
124<screen arch="multilib"><userinput remap="pre">tar -xf ../mpfr-&mpfr-version;.tar.xz
125mv -v mpfr-&mpfr-version; mpfr
126tar -xf ../gmp-&gmp-version;.tar.xz
127mv -v gmp-&gmp-version; gmp
128tar -xf ../mpc-&mpc-version;.tar.gz
129mv -v mpc-&mpc-version; mpc
130tar -xf ../isl-&isl-version;.tar.xz
131mv -v isl-&isl-version; isl</userinput></screen>
132
133 <!-- Following patch might be obsolete with gcc >= 8.2.1 -->
134 <para arch="multilib">Fix an issue with isl-&isl-version;:</para>
135
136<screen arch="multilib"><userinput remap="pre">sed -e "/#include &lt;isl\/schedule_node.h&gt;/ a#include &lt;isl/id.h&gt;\n#include &lt;isl/space.h&gt;" \
137 -i gcc/graphite.h</userinput></screen>
138
139 <para>Create a separate build directory again:</para>
140
141<screen><userinput remap="pre">mkdir -v build
142cd build</userinput></screen>
143
144 <para>Before starting to build GCC, remember to unset any environment
145 variables that override the default optimization flags.</para>
146
147 <para>Now prepare GCC for compilation:</para>
148
149<screen arch="default"><userinput remap="configure">CC=$LFS_TGT-gcc \
150CXX=$LFS_TGT-g++ \
151AR=$LFS_TGT-ar \
152RANLIB=$LFS_TGT-ranlib \
153../configure \
154 --prefix=/tools \
155 --with-local-prefix=/tools \
156 --with-native-system-header-dir=/tools/include \
157 --enable-languages=c,c++ \
158 --disable-libstdcxx-pch \
159 --disable-multilib \
160 --disable-bootstrap \
161 --disable-libgomp</userinput></screen>
162
163<screen arch="multilib"><userinput remap="configure">CC=$LFS_TGT-gcc \
164CXX=$LFS_TGT-g++ \
165AR=$LFS_TGT-ar \
166RANLIB=$LFS_TGT-ranlib \
167../configure \
168 --prefix=/tools \
169 --with-local-prefix=/tools \
170 --with-native-system-header-dir=/tools/include \
171 --enable-languages=c,c++ \
172 --disable-libstdcxx-pch \
173 --enable-multilib \
174 --with-multilib-list=m32,m64,mx32 \
175 --with-system-zlib \
176 --disable-bootstrap \
177 --disable-libgomp</userinput></screen>
178
179 <variablelist>
180 <title>The meaning of the new configure options:</title>
181
182 <varlistentry>
183 <term><parameter>--enable-languages=c,c++</parameter></term>
184 <listitem>
185 <para>This option ensures that both the C and C++ compilers are
186 built.</para>
187 </listitem>
188 </varlistentry>
189
190 <varlistentry>
191 <term><parameter>--disable-libstdcxx-pch</parameter></term>
192 <listitem>
193 <para>Do not build the pre-compiled header (PCH) for
194 <filename class="libraryfile">libstdc++</filename>. It takes up a
195 lot of space, and we have no use for it.</para>
196 </listitem>
197 </varlistentry>
198
199 <varlistentry>
200 <term><parameter>--disable-bootstrap</parameter></term>
201 <listitem>
202 <para>For native builds of GCC, the default is to do a "bootstrap"
203 build. This does not just compile GCC, but compiles it several times.
204 It uses the programs compiled in a first round to compile itself a
205 second time, and then again a third time. The second and third
206 iterations are compared to make sure it can reproduce itself
207 flawlessly. This also implies that it was compiled correctly.
208 However, the LFS build method should provide a solid compiler
209 without the need to bootstrap each time.</para>
210 </listitem>
211 </varlistentry>
212
213 </variablelist>
214
215 <para>Compile the package:</para>
216
217<screen><userinput remap="make">make</userinput></screen>
218
219 <para>Install the package:</para>
220
221<screen><userinput remap="install">make install</userinput></screen>
222
223 <para>As a finishing touch, create a symlink. Many programs and scripts
224 run <command>cc</command> instead of <command>gcc</command>, which is
225 used to keep programs generic and therefore usable on all kinds of UNIX
226 systems where the GNU C compiler is not always installed. Running
227 <command>cc</command> leaves the system administrator free to decide
228 which C compiler to install:</para>
229
230<screen><userinput remap="install">ln -sv gcc /tools/bin/cc</userinput></screen>
231
232 <caution>
233 <para>At this point, it is imperative to stop and ensure that the basic
234 functions (compiling and linking) of the new toolchain are working as
235 expected. To perform a sanity check, run the following commands:</para>
236
237<screen><userinput>echo 'int main(){}' &gt; dummy.c
238cc dummy.c
239readelf -l a.out | grep ': /tools'</userinput></screen>
240
241 <para>If everything is working correctly, there should be no errors,
242 and the output of the last command will be of the form:</para>
243
244<screen><computeroutput>[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]</computeroutput></screen>
245
246
247 <para arch="multilib">Repeat the test for 32-bit:</para>
248
249<screen arch="multilib"><userinput>cc -m32 dummy.c
250readelf -l a.out | grep ': /tools'</userinput></screen>
251
252 <para arch="multilib">In this case, the output shoud be:</para>
253
254<screen arch="multilib"><computeroutput>[Requesting program interpreter: /tools/lib/ld-linux.so.2]</computeroutput></screen>
255
256 <para arch="multilib">Repeat the test for x32-bit:</para>
257
258<screen arch="multilib"><userinput>cc -mx32 dummy.c
259readelf -l a.out | grep ': /tools'</userinput></screen>
260
261 <para arch="multilib">In this case, the output shoud be:</para>
262
263<screen arch="multilib"><computeroutput>[Requesting program interpreter: /tools/lib/ld-linux-x32.so.2]</computeroutput></screen>
264
265 <para arch="default">Note that the dynamic linker will be
266 /tools/lib/ld-linux.so.2 for 32-bit machines.</para>
267
268 <para>If the output is not shown as above or there was no output at all,
269 then something is wrong. Investigate and retrace the steps to find out
270 where the problem is and correct it. This issue must be resolved before
271 continuing on. First, perform the sanity check again, using
272 <command>gcc</command> instead of <command>cc</command>. If this works,
273 then the <filename class="symlink">/tools/bin/cc</filename> symlink is
274 missing. Install the symlink as per above.
275 Next, ensure that the <envar>PATH</envar> is correct. This
276 can be checked by running <command>echo $PATH</command> and verifying that
277 <filename class="directory">/tools/bin</filename> is at the head of the
278 list. If the <envar>PATH</envar> is wrong it could mean that you are not
279 logged in as user <systemitem class="username">lfs</systemitem> or that
280 something went wrong back in <xref linkend="ch-tools-settingenviron"
281 role="."/></para>
282
283 <para>Once all is well, clean up the test files:</para>
284
285<screen><userinput>rm -v dummy.c a.out</userinput></screen>
286
287 </caution>
288
289 </sect2>
290
291 <sect2 role="content">
292 <title/>
293
294 <para>Details on this package are located in
295 <xref linkend="contents-gcc" role="."/></para>
296
297 </sect2>
298
299</sect1>
Note: See TracBrowser for help on using the repository browser.