Re: i386 -> x86_64 cross compile failure (binutils bug?)

Andi Kleen
2005-12-10T04:26:12Z

Lee Revell <rlrevell@joe-job.com> writes:
> >
> > Yes, some commands NEED the -m64 and and WILL NOT work with -m64.
> >
>
> Aha! I disabled CONFIG_IA32_EMULATION and it works perfectly.
>
> So all that's needed to build an x86_64 kernel with the i386 Ubuntu 5.10
> toolchain:
>
> - edit Makefile: add -m64 to CFLAGS and AFLAGS

I guess I can add that.

I'm surprised someone does such a weird setup. Only the very early
x86-64 distributions set up the gccs like this until it was noticed
that a gcc compiled for 64bit targets run noticeable slower on 32bit
and needs more memory. That's because it does everything with long
long internally then and gcc's code generation for long long is not
exactly great. So it's normally better to use a separate cross
compiler for 64bit to keep the 32bit compilations running faster.

Ubuntu seems didn't pay attention to history and just repated that
mistake. In addition they don't seem to be very fond of contributing
changes back - normally one would expect the distribution maintainer
to submit a patch like this if they set up their gcc in non
traditional this way.

But you're the first to bring this problem to my attention.

> - disable CONFIG_IA32_EMULATION

I just tried it here. Adding -m64 to CFLAGS/AFLAGS on a native
64bit biarch toolchain and it compiled without problems. It ends
up with -m64 -m32 for the 32bit vsyscall files, but that seems
to DTRT at least in gcc 4.

I'm not sure what's going wrong. If you use a freshly unmodified tree
and apply the appended patch does it work for you?

-Andi

Pass -m64 by default

This might help on distributions that use a 32bit biarch compiler.

Signed-off-by: Andi Kleen <ak@suse.de>

Index: linux/arch/x86_64/Makefile
===================================================================
--- linux.orig/arch/x86_64/Makefile
+++ linux/arch/x86_64/Makefile
@@ -31,6 +31,7 @@ cflags-$(CONFIG_MK8) += $(call cc-option
cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona)
CFLAGS += $(cflags-y)

+CFLAGS += -m64
CFLAGS += -mno-red-zone
CFLAGS += -mcmodel=kernel
CFLAGS += -pipe
@@ -52,6 +53,8 @@ CFLAGS += $(call cc-option,-funit-at-a-t
# prevent gcc from generating any FP code by mistake
CFLAGS += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,)

+AFLAGS += -m64
+
head-y := arch/x86_64/kernel/head.o arch/x86_64/kernel/head64.o arch/x86_64/kernel/init_task.o

libs-y += arch/x86_64/lib/