This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
the struggle to create a 64-bit gcc on Solaris 10
- From: Dennis Clarke <dclarke at blastwave dot org>
- To: gcc at gcc dot gnu dot org
- Date: Fri, 09 Nov 2012 14:51:59 -0500
- Subject: the struggle to create a 64-bit gcc on Solaris 10
I have been trying repeatedly and in incrementally more rewarding stages towards building a purely 64-bit GCC compiler on Solaris 10 sparc. I have no need for the 32-bit libs at all and my entire toolchain is 64-bit only. There are no 32-bit libs in /usr/local/lib nor do there need to be. Thus far things have gone well with this approach but I have been using the Oraccle Studio compilers to get to this point. Now I need to get to GCC and then never look back.
This has been a struggle as I have needed to hand edit Makefiles over and over and regardless of what I do I end up stopping within stage one of the 3-stage bootstrap with a problem dealing with GMP libs.
I have the sources to gmp, mpfr and mpc extracted in the gcc-4.7.2 source directory. No problem there. I have hand edited Makefiles after configure to ensure that ABI=64 in every Makefile that needs it. Thus :
$ find . -type f -name Makefile | xargs grep "^ABI"
./gmp/mpq/Makefile:ABI = 64
./gmp/tune/Makefile:ABI = 64
./gmp/scanf/Makefile:ABI = 64
./gmp/mpf/Makefile:ABI = 64
./gmp/printf/Makefile:ABI = 64
./gmp/mpn/Makefile:ABI = 64
./gmp/mpz/Makefile:ABI = 64
./gmp/cxx/Makefile:ABI = 64
./gmp/Makefile:ABI = 64
./gmp/tests/devel/Makefile:ABI = 64
./gmp/tests/Makefile:ABI = 64
./gmp/tests/misc/Makefile:ABI = 64
./gmp/tests/rand/Makefile:ABI = 64
./gmp/tests/cxx/Makefile:ABI = 64
./gmp/tests/mpn/Makefile:ABI = 64
./gmp/tests/mpz/Makefile:ABI = 64
./gmp/tests/mpf/Makefile:ABI = 64
./gmp/tests/mpq/Makefile:ABI = 64
./gmp/tests/mpbsd/Makefile:ABI = 64
./gmp/mpbsd/Makefile:ABI = 64
./gmp/demos/calc/Makefile:ABI = 64
./gmp/demos/Makefile:ABI = 64
./gmp/demos/expr/Makefile:ABI = 64
./gmp/doc/Makefile:ABI = 64
After doing this and running gmake I eventually get stopped and see these guys :
$ find . -type f | xargs file | grep ELF | grep -v 64
./gmp/gen-bases: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, not stripped
./gmp/gen-psqr: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, not stripped
./gmp/gen-fac_ui: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, not stripped
./gmp/gen-fib: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, not stripped
./gmp/gen-trialdivtab: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, not stripped
All of which were somehow compiled as 32-bit binaries. No idea where they are coming from and why they did not respect the CFLAGS of "-m64 -mptr64 " which I have hand edited into Makefiles everywhere.
As an example :
$ diff ./Makefile.backup Makefile
414c414
< STAGE_CFLAGS = $(BOOT_CFLAGS)
---
> STAGE_CFLAGS = -m64 -mptr64 -I/usr/local/include:/opt/csw/gcc4/include $(BOOT_CFLAGS)
417c417
< POSTSTAGE1_CONFIGURE_FLAGS = --enable-build-with-cxx
---
> POSTSTAGE1_CONFIGURE_FLAGS = -m64 -mptr64 --enable-build-with-cxx
421,422c421,422
< STAGE1_CFLAGS = $(STAGE_CFLAGS)
< STAGE1_CXXFLAGS = $(CXXFLAGS)
---
> STAGE1_CFLAGS = -m64 -mptr64 $(STAGE_CFLAGS)
> STAGE1_CXXFLAGS = -m64 -mptr64 $(CXXFLAGS)
424,425c424,425
< STAGE1_CXXFLAGS = $(STAGE1_CFLAGS)
< STAGE1_TFLAGS = $(STAGE_TFLAGS)
---
> STAGE1_CXXFLAGS = -m64 -mptr64 $(STAGE1_CFLAGS)
> STAGE1_TFLAGS = -m64 -mptr64 $(STAGE_TFLAGS)
432,433c432,433
< STAGE2_CFLAGS = $(STAGE_CFLAGS)
< STAGE2_CXXFLAGS = $(CXXFLAGS)
---
> STAGE2_CFLAGS = -m64 -mptr64 $(STAGE_CFLAGS)
> STAGE2_CXXFLAGS = -m64 -mptr64 $(CXXFLAGS)
435c435
< STAGE2_CXXFLAGS = $(STAGE2_CFLAGS)
---
> STAGE2_CXXFLAGS = -m64 -mptr64 $(STAGE2_CFLAGS)
443,444c443,444
< STAGE3_CFLAGS = $(STAGE_CFLAGS)
< STAGE3_CXXFLAGS = $(CXXFLAGS)
---
> STAGE3_CFLAGS = -m64 -mptr64 $(STAGE_CFLAGS)
> STAGE3_CXXFLAGS = -m64 -mptr64 $(CXXFLAGS)
446,447c446,447
< STAGE3_CXXFLAGS = $(STAGE3_CFLAGS)
< STAGE3_TFLAGS = $(STAGE_TFLAGS)
---
> STAGE3_CXXFLAGS = -m64 -mptr64 $(STAGE3_CFLAGS)
> STAGE3_TFLAGS = -m64 -mptr64 $(STAGE_TFLAGS)
454,455c454,455
< STAGE4_CFLAGS = $(STAGE_CFLAGS)
< STAGE4_CXXFLAGS = $(CXXFLAGS)
---
> STAGE4_CFLAGS = -m64 -mptr64 $(STAGE_CFLAGS)
> STAGE4_CXXFLAGS = -m64 -mptr64 $(CXXFLAGS)
457,458c457,458
< STAGE4_CXXFLAGS = $(STAGE4_CFLAGS)
< STAGE4_TFLAGS = $(STAGE_TFLAGS)
---
> STAGE4_CXXFLAGS = -m64 -mptr64 $(STAGE4_CFLAGS)
> STAGE4_TFLAGS = -m64 -mptr64 $(STAGE_TFLAGS)
493c493
< STAGE1_CFLAGS = -g -fkeep-inline-functions
---
> STAGE1_CFLAGS = -m64 -mptr64 -g -fkeep-inline-functions
A bit messy I know. However this is pass 1 with hopes that by the third time I do this it will be a fine art.
Any pointers at all as to the error of my ways ?
Dennis
ps: I am using gcc 4.5.1 to perform the bootstrap and this release has been very well tested :
$ which gcc
/opt/csw/gcc4/bin/gcc
$
$ $CC --version
gcc (Blastwave.org Inc. Mon Aug 9 07:10:45 GMT 2010) 4.5.1
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.