Why is building a cross compiler "out-of-the-box" always broken?

Steve Kenton skenton@ou.edu
Sun Aug 19 22:10:00 GMT 2007


> OK, let me recap as I understand the discussion up to now, realizing 
> that this is the gcc list we can really only hope to fix things, if 
> needed, by making changes to the gcc project.  Other project will have 
> other priorities.
>
> It sounds like the consensus is that bootstrapping a cross-compiler 
> still requires the use of inhibit_libc and for a Linux target *should* 
> work like this. And, apparently is does work like this for some people 
> for some targets, just not for everyone for everything.
>
> 1. Configure the Linux kernel and "make headers_install".
>
> 2. Configure and make binutils using the headers produced in step 1.
>
> 3. Configure and make a minimal gcc cross-compiler for the target by 
> getting configure to set inhibit_libc and disabling any complicating 
> or conflicting options such as threads and multilib not strictly 
> needed to build the minimal compiler. This compiler should not be 
> generally used because of the restrictions placed on it during the 
> build process.
>
> 4. Use the minimal cross-compiler produced in step 3 to configure 
> glibc and do "make install-headers" to get glibc headers. At this 
> point you should be able to delete the minimal cross-compiler, it's 
> job has been done.
>
> 5. Make distclean and then configure, make, and install a normal gcc 
> cross-compiler for the target using the glibc headers produced in step 4.
>
> 6. Make distclean and then configure, make, and install the complete 
> glibc header and libraries etc. for the target.
>
> 7. Use the tools produced in steps 5 and 6 to do whatever 
> cross-compiling project you need them for.
>
> Now for some thoughts about this. I assume we are working with current 
> releases of the kernel and tool chain. There are lots of problems with 
> various older combinations of things, let's not go there please right now.
>
> 1. Seems to be a good reliable source of sanitized headers for recent 
> kernels. I know of no problems with the current release.
>
> 2. Seems to build and work out-of-the-box using the headers from step 
> 1.  I know of no problems with current release.
>
> 3. Figuring out the correct combination of --with-newlib, 
> --with-sysroot, and --with-headers (or --without, or =no etc.) to get 
> inhibit_libc set and then figuring out which of the myriad of 
> --with-this-that-and-the-other options can or must be disabled to get 
> a functional minimal compiler is a real pain in the neck.  Further 
> more, the make file may try (and fail) to make additional things like 
> crt0 in EXTRA_PARTS= which require the use of "make -k" and/or  manual 
> copying of the needed bits and pieces. It does not always work and the 
> failures seem to be in different places on different targets. Maybe 
> the make files need to be modified some depending on the configure 
> setting of inhibit_libc?
>
> If this is *supposed* to work, would it be worth while having a 
> --force-bootstrap or some such option so that configure could force 
> inhibit_libc and then short circuit lots of configuration stuff and 
> disable everything appropriate on a per-target basis so we can 
> reliably generate the minimal comiler needed for the next step?  With 
> that, additional places in the source that really need inhibit_libc 
> special casing would be much clearer.  Right now it's a question of 
> "wtf caused that to die?", since bootstrapping a cross-compiler is 
> such a black art to most people. Also, should the inhibit_libc hack 
> also disable things like the unwind support that requires kernel 
> headers?  That not scrictly libc, but --without-headers sort of assume 
> neither are present. It would also be nice if there were a clear 
> statement about what needs to be where in the headers and/or sysroot 
> directory structures.  Or, should be just require some sort of 
> combined tree build in this case?  In which case it would be nice if 
> there were a clear statement about what needs to be copied or 
> symlinked from where to where to make it work. I'm a bit out of my 
> depth since I have *not* gotten it to work for many of the cases I 
> have tried, yet. It's not that I'm unwilling to try and contribute 
> patches, but I'd like to know where we are heading, please.
>
> Some people advocate combining steps 3,4,5 by either cribbing a set of 
> headers from someone elses sysroot, cobbling them together by hand, or 
> by fooling glibc configure in to producing them without having a 
> minimal cross compiler. They build their cross-compiler using these 
> headers and then they proceed to step 6.  That's great if you are only 
> working with one, common, target where you can expect to find someone 
> to crib from or you have better luck than I did trying to understand 
> and fool glibc configure. In any case that leaves us as the mercy of 
> changes to the glibc package, and the glibc maintainers can reasonably 
> assume the existance of a compiler and may use that compiler to check 
> things like sizeof(long double) etc. so it's fragile at best to rely 
> on. (BTW - why do we have both -m128bit-long-double and 
> -mlong-double-128 options for different targets?)  However, it's 
> probably not viable for someone trying to build 20 or so tools chains 
> so they can check for kernel build failure tree wide etc.  And 
> besides, it would sure be nice if gcc would build a cross-compiler 
> out-of-the-box if there is no problem with some other part of the tool 
> chain.  That does not seem to be the case for all targets at this point.
>
> Once you get to step 6, I expect you are home free, or at least are 
> out of the domain off gcc and need to talk to the glibc folks for any 
> problems that pop up at that point.
>
> So, that's the situation as I see it. How should things work in an 
> ideal world and where do we go from here? Or, are other people happy 
> enough with the current ecosystem and think nothing needs to change?
>
> Steve



More information about the Gcc mailing list