Bug 65535 - powerpc64-freebsd build failure
Summary: powerpc64-freebsd build failure
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 5.0
: P3 minor
Target Milestone: 6.0
Assignee: Andreas Tobler
Keywords: build
Depends on:
Reported: 2015-03-24 02:19 UTC by Martin Sebor
Modified: 2015-04-17 20:21 UTC (History)
2 users (show)

See Also:
Target: *-*-freebsd
Known to work:
Known to fail:
Last reconfirmed:


Note You need to log in before you can comment on or make changes to this bug.
Description Martin Sebor 2015-03-24 02:19:38 UTC
Building gcc for powerpc64-freebsd fails with the error below.  Looks like the FBSD_MAJOR macro is defined to nothing:

$ grep FBSD_MAJOR ./gcc/tm.h
#ifndef FBSD_MAJOR
# define FBSD_MAJOR

Defining the macro to an integer such as 10 lets the build succeed.

g++ -c   -g -O2 -DIN_GCC  -DCROSS_DIRECTORY_STRUCTURE  -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fno-common  -DHAVE_CONFIG_H -DGENERATOR_FILE -I. -Ibuild -I../../ppc64fbsd-src/gcc -I../../ppc64fbsd-src/gcc/build -I../../ppc64fbsd-src/gcc/../include  -I../../ppc64fbsd-src/gcc/../libcpp/include  \
	-o build/print-rtl.o ../../ppc64fbsd-src/gcc/print-rtl.c
In file included from ./tm.h:21:0,
                 from ../../ppc64fbsd-src/gcc/print-rtl.c:30:
../../ppc64fbsd-src/gcc/config/freebsd-spec.h:108:16: error: operator '<' has no left operand
 #if FBSD_MAJOR < 5
../../ppc64fbsd-src/gcc/config/freebsd-spec.h:130:16: error: operator '<' has no left operand
 #if FBSD_MAJOR < 6
Makefile:2422: recipe for target 'build/gensupport.o' failed
make[1]: *** [build/gensupport.o] Error 1
make[1]: *** Waiting for unfinished jobs....
Makefile:2422: recipe for target 'build/print-rtl.o' failed
make[1]: *** [build/print-rtl.o] Error 1
rm gcov-tool.pod gcj-dbtool.pod gfortran.pod jcf-dump.pod jv-convert.pod grmic.pod gcj.pod fsf-funding.pod cpp.pod gcov.pod gij.pod gc-analyze.pod gcc.pod gfdl.pod
make[1]: Leaving directory '/home/msebor/build/powerpc64-freebsd/gcc'
Makefile:4129: recipe for target 'all-gcc' failed
make: *** [all-gcc] Error 2
Comment 1 Andreas Tobler 2015-04-04 20:20:03 UTC
Here a native build seems to succeed, right now in stage three with sources from today.

[tritium:head/objdir/gcc] andreast% grep -i fbsd_major *
config.log:tm_defines=' LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3 FBSD_MAJOR=11'
config.status:S["tm_defines"]=" LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3 FBSD_MAJOR=11"
tm.h:#ifndef FBSD_MAJOR
tm.h:# define FBSD_MAJOR 11

FBSD_MAJOR is defined during configure time:

config.gcc:line 666

  fbsd_major=`echo ${target} | sed -e 's/.*freebsd//g' | sed -e 's/\..*//g'`
  tm_defines="${tm_defines} FBSD_MAJOR=${fbsd_major}"

Can you give me some details about your setup/build?
Comment 2 Andreas Tobler 2015-04-04 20:23:08 UTC
Btw, cool bug ID ;) 0xffff
Comment 3 Andreas Tobler 2015-04-04 20:35:51 UTC
Unfortunately the build fails with:

/usr/local/bin/ld: libbackend.a(tree-diagnostic.o): bad reloc symbol index (0x10000 >= 0x39) for offset 0x3ee6 in section `.debug_info'
libbackend.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
/export/devel/net/src/gcc/head/gcc/gcc/c/Make-lang.in:71: recipe for target 'cc1' failed
gmake[3]: *** [cc1] Error 1
gmake[3]: Leaving directory '/export/build/src/gcc/head/objdir/gcc'
Makefile:4444: recipe for target 'all-stage3-gcc' failed
gmake[2]: *** [all-stage3-gcc] Error 2

But this is independent to your report.
Comment 4 Martin Sebor 2015-04-05 17:51:34 UTC
This isn't powerpc64 specific.  I didn't specify a FreeBSD version when configuring gcc (i.e., I set --target=powerpc64-freebsd) assuming configure would default to some supported version.  The code in gcc/config.gcc then results in FBSD_MAJOR being defined but empty. The patch below lets me build stage1 (I don't have a FreeBSD sysroot to do a full bootstrap):

index cb08a5c..c668738 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -664,7 +664,7 @@ case ${target} in
   fbsd_major=`echo ${target} | sed -e 's/.*freebsd//g' | sed -e 's/\..*//g'`
-  tm_defines="${tm_defines} FBSD_MAJOR=${fbsd_major}"
+  tm_defines="${tm_defines} FBSD_MAJOR=${fbsd_major:-3}"
   case ${enable_threads} in

If supplying a default version doesn't seem like a good idea another option might be to fail early, during the configure step.
Comment 5 Andreas Tobler 2015-04-16 20:47:56 UTC
Here my patch:


I do not like to hardcode a version number. Would mean to update when needed..

The important thing here is, if you build a cross compiler make sure that the binutils and the gcc target match, including a major version number.

E.g: the binutils --target=amd64-unknown-freebsd10.1 must be equal to the gcc --target=amd64-unknown-freebsd10.1.

It doesn't work if you give a target w/o version number to binutils and one with version number to gcc configury.

The mentoned patch was tested on a CentOS -> amd64-unknown-freebsd11.0 cross also on native FreeBSD (armv6/hf, amd64).
Comment 6 Andreas Tobler 2015-04-17 17:51:17 UTC
Author: andreast
Date: Fri Apr 17 17:50:46 2015
New Revision: 222192

URL: https://gcc.gnu.org/viewcvs?rev=222192&root=gcc&view=rev
PR target/65535
* config.gcc: Exit with a comment when we do not have a major version
number for the FreeBSD target.

Comment 7 Andreas Tobler 2015-04-17 20:21:32 UTC