Skip to contentSkip to conversation

Compiling grub on x86_64

Buildroot Arnout Vandecappelle 2 participants 7 messages Jun 25, 2012 – Jun 28, 2012

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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_64 option 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
#2 lore raw
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_64 is 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_64 option 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.

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
#3 lore raw

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_64 is 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
#4 lore raw

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_64 with 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
#5 lore raw
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
#6 lore raw

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