Compiling grub on x86_64
Hoi all,
I have an x86 project using and internal toolchain and grub as the boot loader. We recently switched to x86_64 (for
syscall performance reasons). Unfortunately, grub fails to even configure: the compiler can't generate executables. It's missing -lgcc_s. I guess this is because the toolchain is built without multilib support and grub uses the -m32 switch.
I'm unusually stumped at this point. Building a toolchain with multilib support seems the easy way out, but that's a
bit heavy just to be able to compile grub. A 64-bit build of grub will probably not work because BIOSes don't understand 64-bit. So the best thing I can come up with is to have a separate buildroot config just to build grub. Does anyone have better ideas?
With this in mind, it's probably best to remove the BR2_x86_64 option from the grub config, or at least limit it to
external toolchains that may work (i.e. Sourcery). BTW, Thomas & Peter, am I correct in assuming that grub is not included in the autobuilds?
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286540 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
Hello,
Le Mon, 25 Jun 2012 09:51:52 +0200,
Arnout Vandecappelle <[email protected]> a ?crit :
Quoted 9 lines
I have an x86 project using and internal toolchain and grub as the boot loader. We recently switched to
x86_64(for
syscall performance reasons). Unfortunately, grub fails to even configure: the compiler can't generate executables. It's missing -lgcc_s. I guess this is because the toolchain is built without multilib support and grub uses the -m32 switch.I'm unusually stumped at this point. Building a toolchain with multilib support seems the easy way out, but that's a
bit heavy just to be able to compile grub. A 64-bit build of grub will probably not work because BIOSes don't understand 64-bit. So the best thing I can come up with is to have a separate buildroot config just to build grub. Does anyone have better ideas?
No, it's a difficult problem. And the issue came up several times on the list already. How much effort would it be to also generate a multilib 32bits/64bits toolchain when x86_64 is used?
Quoted 2 lines
With this in mind, it's probably best to remove the
BR2_x86_64option from the grub config, or at least limit it to
external toolchains that may work (i.e. Sourcery).
At least for now, yes, making sure that Grub can't be selected with internal toolchains on x86_64 seems like a good idea.
Quoted 2 lines
BTW, Thomas & Peter, am I correct in assuming that grub is not
included in the autobuilds?
Correct. At least here, my random builds use randpackageconfig, so only the package choices are randomized. The kernel and bootloaders builds are therefore never exercised at the moment. The purpose of the random autobuilds is to find missing dependencies, issues on specific architectures, etc.
Best regards,
Thomas
Signature · 4 lines
Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
Quoted 10 lines · Thomas Petazzoni
Hello,
Le Mon, 25 Jun 2012 09:51:52 +0200,
Arnout Vandecappelle<[email protected]> a ?crit :Quoted 5 lines
I have an x86 project using and internal toolchain and grub as the boot loader. We recently switched to
x86_64(for
syscall performance reasons). Unfortunately, grub fails to even configure: the compiler can't generate executables. It's missing -lgcc_s. I guess this is because the toolchain is built without multilib support and grub uses the -m32 switch.
Quoted 8 lines
Quoted 4 lines
I'm unusually stumped at this point. Building a toolchain with multilib support seems the easy way out, but that's a
bit heavy just to be able to compile grub. A 64-bit build of grub will probably not work because BIOSes don't understand 64-bit. So the best thing I can come up with is to have a separate buildroot config just to build grub. Does anyone have better ideas?No, it's a difficult problem. And the issue came up several times on the list already. How much effort would it be to also generate a multilib 32bits/64bits toolchain when
x86_64is used?
It's certainly not trivial... Here's a list of issues I can come up with:
* It requires a different implementation for internal, crosstool-NG and external toolchains.
* For external toolchains, there should be a check if it is multilib or not.
* For external toolchains, the wrapper has to change a lot because the -m32 may imply a different -march and -mtune.
* crosstool-NG itself has no support for multilib AFAICS. Support would have to be added.
* For internal toolchains, uClibc has to be built twice.
* Final gcc stage should be configured with the multilib paths.
* Are the multilib libraries installed to the target? For grub this isn't really needed, but if something else compiles with -m32...
* Are other libraries compiled with multilib variants?
Quoted 6 lines
Quoted 3 lines
With this in mind, it's probably best to remove the
BR2_x86_64option from the grub config, or at least limit it to
external toolchains that may work (i.e. Sourcery).At least for now, yes, making sure that Grub can't be selected with internal toolchains on
x86_64seems like a good idea.
Turns out that it currently also doesn't work with multilib external toolchains.
The wrapper sets --sysroot to a path which doesn't contain the 32-bit libs.
For the time being, I guess grub should be disabled for all 64-bit configurations.
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286540 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
Le Thu, 28 Jun 2012 10:09:57 +0200,
Arnout Vandecappelle <[email protected]> a ?crit :
Quoted 6 lines
Quoted 3 lines
No, it's a difficult problem. And the issue came up several times on the list already. How much effort would it be to also generate a multilib 32bits/64bits toolchain when
x86_64is used?It's certainly not trivial... Here's a list of issues I can come up with:
Quoted 12 lines
* It requires a different implementation for internal, crosstool-NG and external toolchains.
* For external toolchains, there should be a check if it is multilib or not.
* For external toolchains, the wrapper has to change a lot because the -m32 may imply a different -march and -mtune.
* crosstool-NG itself has no support for multilib AFAICS. Support would have to be added.
* For internal toolchains, uClibc has to be built twice.
* Final gcc stage should be configured with the multilib paths.
* Are the multilib libraries installed to the target? For grub this isn't really needed, but if something else compiles with -m32...
* Are other libraries compiled with multilib variants?
Quite a few issues :-)
Quoted 4 lines
Turns out that it currently also doesn't work with multilib external toolchains.
The wrapper sets --sysroot to a path which doesn't contain the 32-bit libs.For the time being, I guess grub should be disabled for all 64-bit configurations.
Agreed. It's however a shame that it's not possible to build a complete bootloader+kernel+rootfs for x86_64 with a single Buildroot configuration :-(
How other build systems handle this?
Regards,
Thomas
Signature · 4 lines
Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
Le Thu, 28 Jun 2012 11:46:31 +0200,
Thomas Petazzoni <[email protected]> a ?crit :
Quoted 5 lines
Agreed. It's however a shame that it's not possible to build a complete bootloader+kernel+rootfs for
x86_64with a single Buildroot configuration :-(How other build systems handle this?
Other questions:
* What about using the host compiler to build Grub? I know it sounds a bit funky, but in practice, most Buildroot users will work on x86/x86_64 machines. If they are on x86, then it just works, if they work on x86_64, then most likely they have a multilib 32/64 toolchain installed on their host. This would at least enable, for most users, the possibility of building Grub as part of a x86_64 target system configuration.
* What does Grub really require from gcc_s? Is it impossible to rework Grub to make independent from the compiler companion libraries?
Regards,
Thomas
Signature · 4 lines
Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com
Quoted 2 lines · Thomas Petazzoni
* What does Grub really require from
gcc_s? Is it impossible to rework Grub to make independent from the compiler companion libraries?
I was thinking along those lines as well. I'll take a look at it but it may
take some time.
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286540 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
Le Thu, 28 Jun 2012 14:44:06 +0200,
Arnout Vandecappelle <[email protected]> a ?crit :
Quoted 2 lines
I was thinking along those lines as well. I'll take a look at it but it may
take some time.
I had a 5 minutes look, and it seems not to be very easy: while the compilation of Grub should probably work without these companion libraries, all the checks in the ./configure script assumes that a working gcc -m32 compiler is available.
Also, is it worth spending so much time on Grub 0.97, now that Grub 2.0 has been (finally) released?
Thomas
Signature · 4 lines
Thomas Petazzoni, Free Electrons Kernel, drivers, real-time and embedded Linux development, consulting, training and support. http://free-electrons.com