source: chapter05/toolchaintechnotes.xml@ 0ba4e25

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.3 6.4 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 0ba4e25 was 0ba4e25, checked in by Matthew Burgess <matthew@…>, 19 years ago

Minor typo and grammar fixes (Chris Staub)

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