Search code examples
makefilegdbcross-compilingbinutils

Error cross-compiling binutils-gdb for windows


I cloned binutils-gdb repository from here (master branch) on a linux machine (Ubuntu) and I want to compile it for Windows (using x86_64_w64_mingw32 toolchain).

First, I ran ./configure with the following options to specify the cross-compile toolchain.

./configure --prefix=/usr/x86_64-w64-mingw32 --target=arm-none-eabi --host=x86_64-w64-mingw32

Then I ran make and get the following error (I omitted most of the output because it is pretty large):

[...]
x86_64-w64-mingw32-gcc  -DHAVE_CONFIG_H  -DWITH_DEFAULT_ALIGNMENT=STRICT_ALIGNMENT     -DDEFAULT_INLINE=0   -Wall -Wdeclaration-after-statement -Wpointer-arith -Wpointer-sign -Wno-unused -Wunused-value -Wunused-function -Wno-switch -Wno-char-subscripts -Wmissing-prototypes -Wdeclaration-after-statement -Wempty-body -Wmissing-parameter-type -Wold-style-declaration -Wold-style-definition -Wno-format -Werror  -DMODET -I. -I. -I../common -I./../common -I../../include -I./../../include -I../../bfd -I./../../bfd -I../../opcodes -I./../../opcodes -I../../intl -g -O2     -c -o callback.o -MT callback.o -MMD -MP -MF .deps/callback.Tpo ./../common/callback.c
./../common/callback.c: In function ‘os_time’:
./../common/callback.c:417:25: error: passing argument 1 of ‘time’ from incompatible pointer type [-Werror=incompatible-pointer-types]
  417 |   return wrap (p, time (t));
      |                         ^
      |                         |
      |                         long int *
In file included from ./../common/callback.c:35:
/usr/share/mingw-w64/include/time.h:230:47: note: expected ‘time_t *’ {aka ‘long long int *’} but argument is of type ‘long int *’
  230 | static __inline time_t __CRTDECL time(time_t *_Time) { return _time64(_Time); }
      |                                       ~~~~~~~~^~~~~
cc1: all warnings being treated as errors
make[3]: *** [Makefile:513: callback.o] Error 1
make[3]: Leaving directory '/media/D/Work/FC/binutils-gdb/sim/arm'
make[2]: *** [Makefile:928: all-recursive] Error 1
make[2]: Leaving directory '/media/D/Work/FC/binutils-gdb/sim'
make[1]: *** [Makefile:8376: all-sim] Error 2
make[1]: Leaving directory '/media/D/Work/FC/binutils-gdb'
make: *** [Makefile:915: all] Error 2

I think it has something to do with time_t being typedef'd as a long long int (64 bit integer) in the host platform (Windows), however, the function os_time from the file sim/common/callback.c:414 (path relative to project root), takes a long (32 bit integer) as a parameter:

static long
os_time (host_callback *p, long *t)
{
  return wrap (p, time (t));
}

How can I fix this error? Or are there any issue trackers for binutils-gdb?


Solution

  • This is because you are building the current, non-release,development version - I got the exact same error while building from the latest git revision at the time I cloned the repository, 0a703a4cedffa6f3824e87f115e8d392e32de191.

    If you really want to build from the development tree, you will have to wait for the issue to be fixed, or to fix it by yourself - this is not being addressed in this answer.

    But if building the latest released version, 2.36.1, is sufficient, the procedure hereafter will work (tested on Ubuntu 20.04 TLS):

    wget https://ftp.gnu.org/gnu/binutils/binutils-2.36.1.tar.gz
    tar zxf binutils-2.36.1.tar.gz
    mkdir binutils
    cd binutils
    ../binutils-2.36.1/configure --prefix=$(pwd)/binutils-2.36.1-x86_64-w64-mingw32 --target=arm-none-eabi --program-prefix=arm-none-eabi- --host=x86_64-w64-mingw32
    make
    make install
    ll -gG binutils-2.36.1-x86_64-w64-mingw32/bin/
    total 159144
    drwxrwxr-x 2     4096 Apr  7 14:41 ./
    drwxrwxr-x 6     4096 Apr  7 14:41 ../
    -rwxr-xr-x 1  9212998 Apr  7 14:41 arm-none-eabi-addr2line.exe*
    -rwxr-xr-x 2  9748961 Apr  7 14:41 arm-none-eabi-ar.exe*
    -rwxr-xr-x 2 14457348 Apr  7 14:41 arm-none-eabi-as.exe*
    -rwxr-xr-x 1  9077841 Apr  7 14:41 arm-none-eabi-c++filt.exe*
    -rwxr-xr-x 1   816086 Apr  7 14:41 arm-none-eabi-elfedit.exe*
    -rwxr-xr-x 1 10783524 Apr  7 14:41 arm-none-eabi-gprof.exe*
    -rwxr-xr-x 4 14526998 Apr  7 14:41 arm-none-eabi-ld.bfd.exe*
    -rwxr-xr-x 4 14526998 Apr  7 14:41 arm-none-eabi-ld.exe*
    -rwxr-xr-x 2  9259673 Apr  7 14:41 arm-none-eabi-nm.exe*
    -rwxr-xr-x 2 10655762 Apr  7 14:41 arm-none-eabi-objcopy.exe*
    -rwxr-xr-x 2 14908446 Apr  7 14:41 arm-none-eabi-objdump.exe*
    -rwxr-xr-x 2  9748961 Apr  7 14:41 arm-none-eabi-ranlib.exe*
    -rwxr-xr-x 2  6156460 Apr  7 14:41 arm-none-eabi-readelf.exe*
    -rwxr-xr-x 1  9193640 Apr  7 14:41 arm-none-eabi-size.exe*
    -rwxr-xr-x 1  9190290 Apr  7 14:41 arm-none-eabi-strings.exe*
    -rwxr-xr-x 2 10655762 Apr  7 14:41 arm-none-eabi-strip.exe*
    

    I did not test building from the git repository after having checked-out the binutils-2_36_1 tag:

    git -C binutils-gdb checkout binutils-2_36_1
    

    But it should work, if what was tagged is what was packaged in the archive file, which should be the case.