source: chapter05/toolchaintechnotes.xml@ ce88af3

6.1 6.1.1
Last change on this file since ce88af3 was afbe6d9, checked in by Matthew Burgess <matthew@…>, 19 years ago

Merge r5317 and 5318 (wording and tagging corrections) to the testing branch

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

  • Property mode set to 100644
File size: 11.8 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
3 <!ENTITY % general-entities SYSTEM "../general.ent">
4 %general-entities;
5]>
6<sect1 id="ch-tools-toolchaintechnotes">
7<title>Toolchain Technical Notes</title>
8<?dbhtml filename="toolchaintechnotes.html"?>
9
10<para>This section explains some of the rationale and technical
11details behind the overall build method. It is not essential to
12immediately understand everything in this section. Most of this
13information will be clearer after performing an actual build. This
14section can be referred back to at any time during the process.</para>
15
16<para>The overall goal of <xref linkend="chapter-temporary-tools"/> is
17to provide a temporary environment that can be chrooted into and from
18which can be produced a clean, trouble-free build of the target LFS
19system in <xref linkend="chapter-building-system"/>. Along the way, we
20separate from the host system as much as possible, and in doing so,
21build a self-contained and self-hosted toolchain. It should be noted
22that the build process has been designed to minimize the risks for new
23readers and provide maximum educational value at the same time. In
24other words, more advanced techniques could be used to build the
25system.</para>
26
27<important>
28<para>Before continuing, be aware of the name of the working platform,
29often referred to as the target triplet. Many times, the target
30triplet will probably be <emphasis>i686-pc-linux-gnu</emphasis>. A
31simple way to determine the name of the target triplet is to run the
32<command>config.guess</command> script that comes with the source for
33many packages. Unpack the Binutils sources and run the script:
34<userinput>./config.guess</userinput> and note the output.</para>
35
36<para>Also be aware of the name of the platform's dynamic linker,
37often referred to as the dynamic loader (not to be confused with the
38standard linker <command>ld</command> that is part of Binutils). The
39dynamic linker provided by Glibc finds and loads the shared libraries
40needed by a program, prepares the program to run, and then runs it.
41The name of the dynamic linker will usually be
42<filename class="libraryfile">ld-linux.so.2</filename>. On platforms that are less
43prevalent, the name might be <filename class="libraryfile">ld.so.1</filename>,
44and newer 64 bit platforms might be named something else entirely. The name of
45the platform's dynamic linker can be determined by looking in the
46<filename class="directory">/lib</filename> directory on the host
47system. A sure-fire way to determine the name is to inspect a random
48binary from the host system by running: <userinput>readelf -l &lt;name
49of binary&gt; | grep interpreter</userinput> and noting the output.
50The authoritative reference covering all platforms is in the
51<filename>shlib-versions</filename> file in the root of the Glibc
52source tree.</para>
53</important>
54
55<para>Some key technical points of how the <xref linkend="chapter-temporary-tools"/> build
56method works:</para>
57
58<itemizedlist>
59<listitem><para>The process is similar in principle to
60cross-compiling, whereby tools installed in the same prefix work in
61cooperation, and thus utilize a little GNU
62<quote>magic</quote></para></listitem>
63
64<listitem><para>Careful manipulation of the standard linker's library
65search path ensures programs are linked only against chosen
66libraries</para></listitem>
67
68<listitem><para>Careful manipulation of <command>gcc</command>'s
69<filename>specs</filename> file tells the compiler which target dynamic
70linker will be used</para></listitem>
71</itemizedlist>
72
73<para>Binutils is installed first because the
74<command>./configure</command> runs of both GCC and Glibc perform
75various feature tests on the assembler and linker to determine which
76software features to enable or disable. This is more important than
77one might first realize. An incorrectly configured GCC or Glibc can
78result in a subtly broken toolchain, where the impact of such breakage
79might not show up until near the end of the build of an entire
80distribution. A test suite failure will usually highlight this error
81before too much additional work is performed.</para>
82
83<beginpage/>
84
85<para>Binutils installs its assembler and linker in two locations,
86<filename class="directory">/tools/bin</filename> and <filename
87class="directory">/tools/$TARGET_TRIPLET/bin</filename>. The tools in
88one location are hard linked to the other. An important facet of the
89linker is its library search order. Detailed information can be
90obtained from <command>ld</command> by passing it the
91<parameter>--verbose</parameter> flag. For example, an <userinput>ld
92--verbose | grep SEARCH</userinput> will illustrate the current search
93paths and their order. It shows which files are linked by
94<command>ld</command> by compiling a dummy program and passing the
95<parameter>--verbose</parameter> switch to the linker. For example,
96<userinput>gcc dummy.c -Wl,--verbose 2&gt;&amp;1 | grep
97succeeded</userinput> will show all the files successfully opened
98during the linking.</para>
99
100<para>The next package installed is GCC. An example of what can be
101seen during its run of <command>./configure</command> is:</para>
102
103<screen><computeroutput>checking what assembler to use...
104 /tools/i686-pc-linux-gnu/bin/as
105checking what linker to use... /tools/i686-pc-linux-gnu/bin/ld</computeroutput></screen>
106
107<para>This is important for the reasons mentioned above. It also
108demonstrates that GCC's configure script does not search the PATH
109directories to find which tools to use. However, during the actual
110operation of <command>gcc</command> itself, the same
111search paths are not necessarily used. To find out which standard
112linker <command>gcc</command> will use, run: <userinput>gcc
113-print-prog-name=ld</userinput>.</para>
114
115<para>Detailed information can be obtained from <command>gcc</command>
116by passing it the <parameter>-v</parameter> command line option while
117compiling a dummy program. For example, <userinput>gcc -v
118dummy.c</userinput> will show detailed information about the
119preprocessor, compilation, and assembly stages, including
120<command>gcc</command>'s included search paths and their order.</para>
121
122<para>The next package installed is Glibc. The most important
123considerations for building Glibc are the compiler, binary tools, and
124kernel headers. The compiler is generally not an issue since Glibc
125will always use the <command>gcc</command> found in a
126<envar>PATH</envar> directory.
127The binary tools and kernel headers can be a bit more complicated.
128Therefore, take no risks and use the available configure switches to
129enforce the correct selections. After the run of
130<command>./configure</command>, check the contents of the
131<filename>config.make</filename> file in the <filename
132class="directory">glibc-build</filename> directory for all important
133details. Note the use of <parameter>CC="gcc -B/tools/bin/"</parameter>
134to control which binary tools are used and the use of the
135<parameter>-nostdinc</parameter> and <parameter>-isystem</parameter>
136flags to control the compiler's include search path. These items
137highlight an important aspect of the Glibc package&mdash;it is very
138self-sufficient in terms of its build machinery and generally does not
139rely on toolchain defaults.</para>
140
141<para>After the Glibc installation, make some adjustments to ensure
142that searching and linking take place only within the <filename
143class="directory">/tools</filename> prefix. Install an adjusted
144<command>ld</command>, which has a hard-wired search path limited to
145<filename class="directory">/tools/lib</filename>. Then amend
146<command>gcc</command>'s specs file to point to the new dynamic linker
147in <filename class="directory">/tools/lib</filename>. This last step
148is vital to the whole process. As mentioned above, a hard-wired path
149to a dynamic linker is embedded into every Executable and Link Format
150(ELF)-shared executable. This can be inspected by running:
151<userinput>readelf -l &lt;name of binary&gt; | grep
152interpreter</userinput>. Amending gcc's specs file
153ensures that every program compiled from here through the end of this
154chapter will use the new dynamic linker in <filename
155class="directory">/tools/lib</filename>.</para>
156
157<para>The need to use the new dynamic linker is also the reason why
158the Specs patch is applied for the second pass of GCC. Failure to do
159so will result in the GCC programs themselves having the name of the
160dynamic linker from the host system's <filename
161class="directory">/lib</filename> directory embedded into them, which
162would defeat the goal of getting away from the host.</para>
163
164<para>During the second pass of Binutils, we are able to utilize the
165<parameter>--with-lib-path</parameter> configure switch to control
166<command>ld</command>'s library search path. From this point onwards,
167the core toolchain is self-contained and self-hosted. The remainder of
168the <xref linkend="chapter-temporary-tools"/> packages all build
169against the new Glibc in <filename
170class="directory">/tools</filename>.</para>
171
172<beginpage/>
173
174<para>Upon entering the chroot environment in <xref
175linkend="chapter-building-system"/>, the first major package to be
176installed is Glibc, due to its self-sufficient nature mentioned above.
177Once this Glibc is installed into <filename
178class="directory">/usr</filename>, perform a quick changeover of the
179toolchain defaults, then proceed in building the rest of the target
180LFS system.</para>
181
182<!-- Removed as part of the fix for bug 1061 - we no longer build pass1
183 packages statically, therefore this explanation isn't required -->
184
185<!--<sect2>
186<title>Notes on Static Linking</title>
187
188<para>Besides their specific task, most programs have to perform many
189common and sometimes trivial operations. These include allocating
190memory, searching directories, reading and writing files, string
191handling, pattern matching, arithmetic, and other tasks. Instead of
192obliging each program to reinvent the wheel, the GNU system provides
193all these basic functions in ready-made libraries. The major library
194on any Linux system is Glibc.</para>
195
196<para>There are two primary ways of linking the functions from a
197library to a program that uses them&mdash;statically or dynamically. When
198a program is linked statically, the code of the used functions is
199included in the executable, resulting in a rather bulky program. When
200a program is dynamically linked, it includes a reference to the
201dynamic linker, the name of the library, and the name of the function,
202resulting in a much smaller executable. A third option is to use the
203programming interface of the dynamic linker (see the
204<emphasis>dlopen</emphasis> man page for more information).</para>
205
206<para>Dynamic linking is the default on Linux and has three major
207advantages over static linking. First, only one copy of the executable
208library code is needed on the hard disk, instead of having multiple
209copies of the same code included in several programs, thus saving
210disk space. Second, when several programs use the same library
211function at the same time, only one copy of the function's code is
212required in core, thus saving memory space. Third, when a library
213function gets a bug fixed or is otherwise improved, only the one
214library needs to be recompiled instead of recompiling all programs
215that make use of the improved function.</para>
216
217<para>If dynamic linking has several advantages, why then do we
218statically link the first two packages in this chapter? The reasons
219are threefold&mdash;historical, educational, and technical. The
220historical reason is that earlier versions of LFS statically linked
221every program in this chapter. Educationally, knowing the difference
222between static and dynamic linking is useful. The technical benefit is
223a gained element of independence from the host, meaning that those
224programs can be used independently of the host system. However, it is
225worth noting that an overall successful LFS build can still be
226achieved when the first two packages are built dynamically.</para>
227
228</sect2>-->
229
230</sect1>
231
Note: See TracBrowser for help on using the repository browser.