GMP 6.3.0: Failure building on MinGW (defaulting to ABI=64)

Simon Sobisch simonsobisch at
Sun Dec 10 18:57:24 CET 2023

Problem when building from 6.3.0 release tarball:

libtool: compile:  ../mpn/m4-ccas --m4=m4 gcc -c -DHAVE_CONFIG_H -I. 
-I.. -D__GMP_WITHIN_GMP -I.. -DOPERATION_x86_64_add_n -Wno-attribute 
x86_64_add_n.asm  -DDLL_EXPORT -DPIC -o .libs/x86_64_add_n.o
-DDLL_EXPORT -DPIC x86_64_add_n.asm >tmp-x86_64_add_n.s
  gcc -c -DHAVE_CONFIG_H -I. -I.. -D__GMP_WITHIN_GMP -I.. 
-DOPERATION_x86_64_add_n -Wno-attribute tmp-x86_64_add_n.s -DDLL_EXPORT 
-DPIC -o .libs/x86_64_add_n.o
tmp-x86_64_add_n.s: Assembler messages:
tmp-x86_64_add_n.s:112: Error: bad register name `%rdi'
tmp-x86_64_add_n.s:113: Error: bad register name `%rsi'
tmp-x86_64_add_n.s:114: Error: bad register name `%rcx'
tmp-x86_64_add_n.s:115: Error: bad register name `%rdx'
tmp-x86_64_add_n.s:116: Error: bad register name `%r8'
tmp-x86_64_add_n.s:117: Error: bad register name `%r9'
tmp-x86_64_add_n.s:119: Error: bad register name `%rsp)'
tmp-x86_64_add_n.s:121: Error: bad register name `%rcx'
tmp-x86_64_add_n.s:123: Error: bad register name `%r8'
tmp-x86_64_add_n.s:124: Error: `jrcxz' is only supported in 64-bit mode
make[2]: *** [x86_64_add_n.lo] Error 1


$ ./config.guess && gcc --version && as --version

gcc.exe ( GCC Build-2) 9.2.0

GNU assembler (GNU Binutils) 2.32
This assembler was configured for a target of `mingw32'.

configure options:

./configure --prefix=/mingw --enable-fat \
    --enable-shared --disable-static

configure outputs:

using ABI="64"
       MPN_PATH=" x86_64/coreihwl x86_64/coreisbr x86_64/coreinhm 
x86_64/core2 x86_64 generic"

checking if the assembler knows about the mulx instruction... no
configure: WARNING: 
configure: WARNING: | Host CPU has the mulx instruction, but it can't be
configure: WARNING: | assembled by
configure: WARNING: |     gcc -c
configure: WARNING: | Older x86 instructions will be used.
configure: WARNING: | This will be an inferior build.
configure: WARNING: 

configure: summary of build options:

   Version:           GNU MP 6.3.0
   Host type:         haswell-pc-mingw32
   ABI:               64
   Install prefix:    /mingw
   Compiler:          gcc
   Static libraries:  no
   Shared libraries:  yes

As the issue "obviously" is the ABI that doesn't match I've tried with 
ABI=32, which works a bit better, to then error with:

libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -D__GMP_WITHIN_GMP -I.. 
-DOPERATION_fat_com -c fat_com.c  -DDLL_EXPORT -DPIC -o .libs/fat_com.o
In file included from ../gmp-impl.h:147,
                  from ../mpn/generic/com.c:31,
                  from .././mpn/x86/fat/com.c:32,
                  from fat_com.c:10:
../fib_table.h:4:1: warning: data definition has no type or storage class
     4 | Error, error, this data is for 64 bits
       | ^~~~~
../fib_table.h:4:1: warning: type defaults to 'int' in declaration of 
'Error' [-Wimplicit-int]
../fib_table.h:4:8: warning: type defaults to 'int' in declaration of 
'error' [-Wimplicit-int]
     4 | Error, error, this data is for 64 bits
       |        ^~~~~
../fib_table.h:4:20: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'data'
     4 | Error, error, this data is for 64 bits
       |                    ^~~~
make[2]: *** [fat_com.lo] Error 1

This error seems to be related to changing the ABI after the initial 
configure. Using "make distclean" fixes this.

I therefore think that something like `AC_ARG_VAR([ABI], [Application 
Binary Interface to use])` (maybe also reference in its description) should be 
added to to make that error on an ABI change and also 
adding this missing piece to configure's help output.

Using the right ABI all tests pass.

Rechecked with GMP 6.2.1 - the ABI needs to be specified there manually, 
too, the same warning is seen in the output.

Just to let you know: make check resulted in multiple occurrences of

   libtool: warning: '-no-install' is ignored for haswell-pc-mingw32
   libtool: warning: assuming '-no-fast-install' instead

Side note, just FYI: to build without warnings on MinGW (also with 
recent MSYS2) the following additional option needs to be specified
   CFLAGS="-Wno-attributes -Wno-ignored-attributes"


More information about the gmp-bugs mailing list