adjusting.xml 6.2 KB

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