source: chapter05/adjusting.xml@ 0e5c784

Last change on this file since 0e5c784 was 81109e3, checked in by Manuel Canales Esparcia <manuel@…>, 19 years ago

Indenting chapter 05, part 1.

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

  • Property mode set to 100644
File size: 6.4 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
3 "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
4 <!ENTITY % general-entities SYSTEM "../general.ent">
5 %general-entities;
6]>
7
8<sect1 id="ch-tools-adjusting">
9 <?dbhtml filename="adjusting.html"?>
10
11 <title>Adjusting the Toolchain</title>
12
13 <para>Now that the temporary C libraries have been installed, all
14 tools compiled in the rest of this chapter should be linked against
15 these libraries. In order to accomplish this, the linker and the
16 compiler's specs file need to be adjusted.</para>
17
18 <para>The linker, adjusted at the end of the first pass of Binutils,
19 is installed by running the following command from within the
20 <filename class="directory">binutils-build</filename> directory:</para>
21
22<screen><userinput>make -C ld install</userinput></screen>
23
24 <para>From this point onwards, everything will link only against the
25 libraries in <filename class="directory">/tools/lib</filename>.</para>
26
27 <note>
28 <para>If the earlier warning to retain the Binutils source and
29 build directories from the first pass was missed, ignore the above
30 command. This results in a small chance that the subsequent testing
31 programs will link against libraries on the host. This is not ideal,
32 but it is not a major problem. The situation is corrected when the
33 second pass of Binutils is installed later.</para>
34 </note>
35
36 <para>Now that the adjusted linker is installed, the Binutils build and source
37 directories should be removed.</para>
38
39 <para>The next task is to point GCC to the new dynamic linker. This is done by
40 dumping GCC's <quote>specs</quote> file to a location where GCC will look for it
41 by default. A simple <command>sed</command> substitution then alters the
42 dynamic linker that GCC will use:</para>
43
44<!-- Ampersands are needed to allow copy and paste -->
45<screen><userinput>SPECFILE=`dirname $(gcc -print-libgcc-file-name)`/specs &amp;&amp;
46gcc -dumpspecs > $SPECFILE &amp;&amp;
47sed 's@^/lib/ld-linux.so.2@/tools&amp;@g' $SPECFILE &gt; tempspecfile &amp;&amp;
48mv -vf tempspecfile $SPECFILE &amp;&amp;
49unset SPECFILE</userinput></screen>
50
51 <para>It is recommended that the above command be copy-and-pasted in order to
52 ensure accuracy. Alternatively, the specs file can be edited by hand. This is
53 done by replacing every occurrence of <quote>/lib/ld-linux.so.2</quote> with
54 <quote>/tools/lib/ld-linux.so.2</quote></para>
55
56 <para>Be sure to visually inspect the specs file in order to verify the
57 intended changes have been made.</para>
58
59 <important>
60 <para>If working on a platform where the name of the dynamic linker is
61 something other than <filename class="libraryfile">ld-linux.so.2</filename>,
62 replace <quote>ld-linux.so.2</quote> with the name of the platform's
63 dynamic linker in the above commands. Refer back to <xref
64 linkend="ch-tools-toolchaintechnotes" role=","/> if necessary.</para>
65 </important>
66
67 <para>During the build process, GCC runs a script
68 (<command>fixincludes</command>) that scans the system for header files
69 that may need to be fixed (they might contain syntax errors, for example),
70 and installs the fixed versions in a private include directory. There is a
71 possibility that, as a result of this process, some header files from the
72 host system have found their way into GCC's private include directory. As
73 the rest of this chapter only requires the headers from GCC and Glibc,
74 which have both been installed at this point, any <quote>fixed</quote>
75 headers can safely be removed. This helps to avoid any host headers
76 polluting the build environment. Run the following commands to remove the
77 header files in GCC's private include directory (you may find it easier to
78 copy and paste these commands, rather than typing them by hand, due to
79 their length):</para>
80
81<!-- && used to ease copy and pasting -->
82<screen><userinput>GCC_INCLUDEDIR=`dirname $(gcc -print-libgcc-file-name)`/include &amp;&amp;
83find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; &amp;&amp;
84rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` &amp;&amp;
85unset GCC_INCLUDEDIR</userinput></screen>
86
87 <caution>
88 <para>At this point, it is imperative to stop and ensure that the basic
89 functions (compiling and linking) of the new toolchain are working as
90 expected. To perform a sanity check, run the following commands:</para>
91
92<screen><userinput>echo 'main(){}' &gt; dummy.c
93cc dummy.c
94readelf -l a.out | grep ': /tools'</userinput></screen>
95
96 <para>If everything is working correctly, there should be no errors,
97 and the output of the last command will be of the form:</para>
98
99<screen><computeroutput>[Requesting program interpreter:
100 /tools/lib/ld-linux.so.2]</computeroutput></screen>
101
102 <para>Note that <filename class="directory">/tools/lib</filename>
103 appears as the prefix of the dynamic linker.</para>
104
105 <para>If the output is not shown as above or there was no output at all,
106 then something is wrong. Investigate and retrace the steps to find out
107 where the problem is and correct it. This issue must be resolved before
108 continuing on. First, perform the sanity check again, using
109 <command>gcc</command> instead of <command>cc</command>. If this works,
110 then the <filename class="symlink">/tools/bin/cc</filename> symlink is
111 missing. Revisit <xref linkend="ch-tools-gcc-pass1" role=","/> and install
112 the symlink. Next, ensure that the <envar>PATH</envar> is correct. This
113 can be checked by running <command>echo $PATH</command> and verifying that
114 <filename class="directory">/tools/bin</filename> is at the head of the
115 list. If the <envar>PATH</envar> is wrong it could mean that you are not
116 logged in as user <systemitem class="username">lfs</systemitem> or that
117 something went wrong back in <xref linkend="ch-tools-settingenviron"
118 role="."/> Another option is that something may have gone wrong with the
119 specs file amendment above. In this case, redo the specs file amendment,
120 being careful to copy-and-paste the commands.</para>
121
122 <para>Once all is well, clean up the test files:</para>
123
124<screen><userinput>rm -v dummy.c a.out</userinput></screen>
125
126 <para>Building TCL in the next section will serve as an additional check that
127 the toolchain has been built properly. If TCL fails to build, it is an
128 indication that something has gone wrong with the Binutils, GCC, or Glibc
129 installation, but not with TCL itself.</para>
130 </caution>
131
132</sect1>
Note: See TracBrowser for help on using the repository browser.