Hello, I was trying to find a way to build some LFS-like x86_64 system from Debian Lenny x86 (which has 32-bit userspace, a patched compiler that accepts -m64 to produce 64-bit binaries, some multilib setup, and an option to install a 64-bit kernel). The current x86_64 branch fails due to ld not recognizing the host's glibc, so I upgraded binutils to HJL version. Also, I replaced all instances of "gcc -B/usr/bin" with "gcc -m64 -B/usr/bin" in the book. Even then, the build failed with "specs: invalid argument" while bootstrapping gcc pass1.
In order to build /tools to the end, I had to make the following extra adjustments: add --disable-libmudflap to gcc pass1, and replace "make bootstrap" with just "make" there (presumably, there is some mismatch with 64-bit glibc or headers and toolchain on the host). So a question naturally arises: is it really true that bootstrapping gcc pass1 improves the range of hosts that are capable to build LFS? (accepted answers: "no", "yes, build from host XXX version XXX fails without bootstrapping") More thoughts: assuming that the host gcc does its job properly (i.e., given some C code, produces some possibly suboptimal machine code that, nevertheless, does what the programmer intended), the bootstrap stages in gcc should behave as follows: Host gcc compiles stage1, that translates C into x86 or x86_64 assembly according to the rules that can be found in the gcc sources (they may be different from the rules in host's gcc). Features: correct (definition: "according to gcc sources") output. stage1 compiles stage2, that produces _exactly_ the same machine code, because it is produced by compiling the same source code. stage2 may contain different (but functionally exactly equivalent) code from stage1, because stage1 was compiled by the host's gcc, while stage2 was compiled by stage1, and they use different rules for translation of C into assembly. Features: correct output (same as produced by stage1), compiled by "itself". stage2 compiles stage3. The result should be exactly the same, because these two stages were produced by translating the same C source into assembly according to the same rules. Features: correct output (same as produced by stage1), compiled by "itself", proves the correctness of the bootstrap. But, for the purpose of compiling glibc and testsuite tools (and these the only things we compile with gcc pass1), we care only about the correct output. So even stage1 is good enough, so again - why bootstrap? -- Alexander E. Patrakov -- http://linuxfromscratch.org/mailman/listinfo/lfs-dev FAQ: http://www.linuxfromscratch.org/faq/ Unsubscribe: See the above information page