qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 2/6] configure, pc-bios/optionrom: pass cross CFLAGS correctl


From: Paolo Bonzini
Subject: Re: [PATCH 2/6] configure, pc-bios/optionrom: pass cross CFLAGS correctly
Date: Wed, 22 Jun 2022 11:31:04 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0

On 6/21/22 16:55, Richard Henderson wrote:
On 6/21/22 00:51, Paolo Bonzini wrote:
diff --git a/pc-bios/optionrom/Makefile b/pc-bios/optionrom/Makefile
index ea89ce9d59..e90ca2e1c6 100644
--- a/pc-bios/optionrom/Makefile
+++ b/pc-bios/optionrom/Makefile
@@ -11,7 +11,7 @@ CFLAGS = -O2 -g
  quiet-command = $(if $(V),$1,$(if $(2),@printf "  %-7s %s\n" $2 $3 && $1, @$1))   cc-option = $(if $(shell $(CC) $1 -c -o /dev/null -xc /dev/null >/dev/null 2>&1 && echo OK), $1, $2)
-override CFLAGS += -march=i486 -Wall -m16
+override CFLAGS += -march=i486 -Wall $(EXTRA_CFLAGS) -m16

Hmm.  I'm not sure about this.  Given that EXTRA_CFLAGS is going to be e.g. -m32 or empty, being immediately overwritten to -m16, I don't quite see the point.

I added it mostly for consistency with the other pc-bios subdirectories, and because it can also be overridden with --cross-cflags-i386 though.

Even for the default -m32, however, there would be a reason to have $(EXTRA_FLAGS) in there. I have played with removing the direct use of "ld -m" in the build of pc-bios/optionrom, and stumbled on a weird GCC configuration issue. The problem is that some hosts pick the right linker emulation when given -m16, but others don't:

$ gcc -dumpspecs
...
*link:
... %{m16|m32|mx32:;:-m elf_x86_64}  %{m16|m32:-m elf_i386}

# x86_64-w64-mingw32-gcc
...
*link:
%{!m32:-m i386pep} %{m32:-m i386pe} ...

The error is in GCC's gcc/config/i386/mingw-w64.h, which provides a MULTILIB_DEFAULTS #define but does not rely on it:

#undef SPEC_32
#undef SPEC_64
#if TARGET_64BIT_DEFAULT
#define SPEC_32 "m32"           // should be m16|m32
#define SPEC_64 "!m32"          // should be m64
#else
#define SPEC_32 "!m64"          // should be m16|m32
#define SPEC_64 "m64"
#endif

So you need -m32 -m16 on 64-bit hosts! For the "working" specs the -m16 would override -m32, while on the broken ones -m32 is for the linker and -m16 is for the compiler.

Paolo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]