1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
- <!ENTITY % general-entities SYSTEM "../general.ent">
- %general-entities;
- ]>
- <sect1 id="ch-system-readjusting">
- <title>Re-adjusting the toolchain</title>
- <?dbhtml filename="readjusting.html"?>
- <para>Now that the new and final C libraries have been installed, it's time to
- adjust our toolchain again. We'll adjust it so that it will link any newly
- compiled program against these new libraries. This is in fact the same thing we
- did in the <quote>Adjusting</quote> phase in the beginning of the previous
- chapter, even though it looks like the reverse: then we guided the chain from
- the host's <filename class="directory">/{,usr/}lib</filename> to the new
- <filename class="directory">/tools/lib</filename>, now we guide it from that
- same <filename class="directory">/tools/lib</filename> to the LFS's <filename
- class="directory">/{,usr/}lib</filename>.</para>
- <para>First we adjust the linker. For this we retained the
- source and build directories from the second pass over Binutils. Install the
- adjusted linker by running the following from within the
- <filename class="directory">binutils-build</filename> directory:</para>
- <screen><userinput>make -C ld INSTALL=/tools/bin/install install</userinput></screen>
- <note><para>If you somehow missed the earlier warning to retain the Binutils
- source and build directories from the second pass in
- <xref linkend="chapter-temporary-tools"/>, or otherwise accidentally deleted them or just
- don't have access to them, don't worry, all is not lost. Just ignore the above
- command. The result will be that the next package, Binutils, will link against
- the C libraries in <filename class="directory">/tools</filename> rather
- than in <filename class="directory">/{,usr/}lib</filename>. This is not ideal,
- however, our testing has shown that the resulting Binutils program binaries
- should be identical.</para></note>
- <para>From now on every compiled program will link <emphasis>only</emphasis>
- against the libraries in <filename class="directory">/usr/lib</filename> and
- <filename class="directory">/lib</filename>. The extra
- <parameter>INSTALL=/tools/bin/install</parameter> is needed because the Makefile
- created during the second pass still contains the reference to
- <command>/usr/bin/install</command>, which we obviously haven't installed yet.
- Some host distributions contain a <filename class="symlink">ginstall</filename>
- symbolic link which takes precedence in the Makefile and thus can cause a
- problem here. The above command takes care of this also.</para>
- <para>You can now remove the Binutils source and build directories.</para>
- <para>The next thing to do is to amend our GCC specs file so that it points
- to the new dynamic linker. Just like earlier on, we use a sed to accomplish
- this:</para>
- <!-- Ampersands are needed to allow cut and paste -->
- <screen><userinput>sed -i 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \
- `gcc --print-file specs`</userinput></screen>
- <para>Again, cutting and pasting the above is recommended. And just like
- before, it is a good idea to visually inspect the specs file to verify the
- intended change was actually made.</para>
- <important><para>If you are working on a platform where the name of the dynamic
- linker is something other than <filename>ld-linux.so.2</filename>, you
- <emphasis>must</emphasis> substitute <filename>ld-linux.so.2</filename> with the
- name of your platform's dynamic linker in the above commands. Refer back to
- <xref linkend="ch-tools-toolchaintechnotes"/> if necessary.</para></important>
- <caution><para>It is imperative at this point to stop and ensure that the
- basic functions (compiling and linking) of the adjusted toolchain are working
- as expected. For this we are going to perform a simple sanity check:</para>
- <screen><userinput>echo 'main(){}' > dummy.c
- cc dummy.c
- readelf -l a.out | grep ': /lib'</userinput></screen>
- <para>If everything is working correctly, there should be no errors, and the
- output of the last command will be (allowing for platform specific differences
- in dynamic linker name):</para>
- <screen><computeroutput>[Requesting program interpreter: /lib/ld-linux.so.2]</computeroutput></screen>
- <para>Note especially that <filename class="directory">/lib</filename> is now
- the prefix of our dynamic linker.</para>
- <para> If you did not receive the output
- as shown above, or received no output at all, then something is seriously wrong.
- You will need to investigate and retrace your steps to find out where the
- problem is and correct it. There is no point in continuing until this is done.
- Most likely something went wrong with the specs file amendment above.</para>
- <para>Once you are satisfied that all is well, clean up the test files:</para>
- <screen><userinput>rm dummy.c a.out</userinput></screen>
- </caution>
- </sect1>
|