Hello Folks
This is a follow-up to a previous post about "error: ‘TARGET_ALIAS’ undeclared"....
I think I figured out the problem... there is definitely a bug... let me explain... there was another similar post on the Internet and their problem was gcc was including ../bfd/config.h instead of ./config.h when ran from gas/ . Running the offending command with --save-temps confirms my problem is the same. When I rename ../bfd/config.h (to avoid conflict) suddenly 'make' in the gas directory works... so it seems the real problem is in how #includes are resolved... this also occurred when compiling in binutils/ again the fix was the same and magically it all worked...
Now I have the luxury of having access to computers with different compiler versions. With older compilers 4.4.x it works. On newer compilers ( v4.8.3 ) it does not work. So either one of two things are wrong, there is a new bug in GCC in how it handles include file resolution, or there is a bug in the binutils source code where the include statements are not correct and the old version of gcc erroneously did the right thing. Even if this is a bug in gcc I think it would make binutils more robust if the correct config.h was specified explicitly. I noticed that this undefined macro problem pops up a lot and it seems users just give-up before solving the problem...
Could someone here confirm whether this is a binutils bug or whether I should post something on the gcc bug tracker... Thanks
If the problem is really in binutils it can be stated simple as follows: gcc includes the wrong 'config.h' when it is included indirectly through 'include/alloca-conf.h'. Instead of including the local version of 'config.h' it finds bfd/config.h first. This occurs when running make in both 'gas/' and 'binutils/'. The problem is avoided in both cases by temporarily removing 'bfd/config.h'
So let me give some nitty-gritty details to help you understand my problem in greater detail:
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25> gcc --version
gcc (SUSE Linux) 4.8.3 20140627 [gcc-4_8-branch revision 212064]
Copyright (C) 2013 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.
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25> ./configure --prefix=/opt/gcc-4.9.3/install --with-mpc=/opt/gcc-4.9.3/install --with-mpfr=/opt/gcc-4.9.3/install --with-gmp=/opt/gcc-4.9.3/install --with-cloog=/opt/gcc-4.9.3/install --with-isl=/opt/gcc-4.9.3/install --enable-gold=yes --enable-ld=yes --disable-libquadmath --disable-libquadmath-support --enable-lto
... <snipped>...
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25> make
... <snipped>...
gcc -DHAVE_CONFIG_H -I. -I. -I. -I../bfd -I./config -I./../include -I./.. -I./../bfd -DLOCALEDIR="\"/opt/gcc-4.9.3/install/share/locale\"" -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -g -O2 -MT as.o -MD -MP -MF .deps/as.Tpo -c -o as.o as.c
as.c: In function ‘print_version_id’:
as.c:224:14: error: ‘TARGET_ALIAS’ undeclared (first use in this function)
VERSION, TARGET_ALIAS, BFD_VERSION_STRING);
^
as.c:224:14: note: each undeclared identifier is reported only once for each function it appears in
as.c: In function ‘parse_args’:
as.c:635:5: error: ‘TARGET_ALIAS’ undeclared (first use in this function)
TARGET_ALIAS);
^
as.c:649:44: error: ‘TARGET_CANONICAL’ undeclared (first use in this function)
fprintf (stderr, _("canonical = %s\n"), TARGET_CANONICAL);
^
as.c:650:43: error: ‘TARGET_CPU’ undeclared (first use in this function)
fprintf (stderr, _("cpu-type = %s\n"), TARGET_CPU);
^
Makefile:896: recipe for target 'as.o' failed
... <snipped>...
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25> cd gas
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/gas> gcc -DHAVE_CONFIG_H -I. -I. -I. -I../bfd -I./config -I./../include -I./.. -I./../bfd -DLOCALEDIR="\"/opt/gcc-4.9.3/install/share/locale\"" -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -g -O2 -MT as.o -MD -MP -MF .deps/as.Tpo -c -o as.o as.c --save-temps
... <same error> ...
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/gas> head as.i -n 20
# 1 "as.c"
# 1 "/opt/gcc-4.9.3/binutils/binutils-2.25/gas//"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "as.c"
# 34 "as.c"
# 1 "as.h" 1
# 37 "as.h"
# 1 "./../include/alloca-conf.h" 1
# 16 "./../include/alloca-conf.h"
# 1 "../bfd/config.h" 1
# 17 "./../include/alloca-conf.h" 2
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/gas> mv ../bfd/config.h ../bfd/config.h.bak
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/gas> make
... <everything compiles perfectly> ...
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/gas> cd ..
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25> make
... <bfd is recompiled which restores bfd/config.h > ...
... <then I get the following error in binutils:> ...
gcc -DHAVE_CONFIG_H -I. -I. -I. -I../bfd -I./../bfd -I./../include -DLOCALEDIR="\"/opt/gcc-4.9.3/install/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -g -O2 -MT bucomm.o -MD -MP -MF .deps/bucomm.Tpo -c -o bucomm.o bucomm.c
bucomm.c: In function ‘set_default_bfd_target’:
bucomm.c:159:24: error: ‘TARGET’ undeclared (first use in this function)
const char *target = TARGET;
^
bucomm.c:159:24: note: each undeclared identifier is reported only once for each function it appears in
Makefile:932: recipe for target 'bucomm.o' failed
... <snipped> ...
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25> cd binutils
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/binutils> gcc -DHAVE_CONFIG_H -I. -I. -I. -I../bfd -I./../bfd -I./../include -DLOCALEDIR="\"/opt/gcc-4.9.3/install/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -g -O2 -MT bucomm.o -MD -MP -MF .deps/bucomm.Tpo -c -o bucomm.o bucomm.c --save-temps
... <same error> ...
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/binutils> head bucomm.i -n 20
# 1 "bucomm.c"
# 1 "/opt/gcc-4.9.3/binutils/binutils-2.25/binutils//"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "bucomm.c"
# 24 "bucomm.c"
# 1 "sysdep.h" 1
# 23 "sysdep.h"
# 1 "./../include/alloca-conf.h" 1
# 16 "./../include/alloca-conf.h"
# 1 "../bfd/config.h" 1
# 17 "./../include/alloca-conf.h" 2
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/binutils> gcc -DHAVE_CONFIG_H -I. -I. -I. -I../bfd -I./../bfd -I./../include -DLOCALEDIR="\"/opt/gcc-4.9.3/install/share/locale\"" -Dbin_dummy_emulation=bin_vanilla_emulation -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -g -O2 -MT bucomm.o -MD -MP -MF .deps/bucomm.Tpo -c -o bucomm.o bucomm.c --save-temps
... <no errors> ...
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/binutils> head bucomm.i -n 20
# 1 "bucomm.c"
# 1 "/opt/gcc-4.9.3/binutils/binutils-2.25/binutils//"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "bucomm.c"
# 24 "bucomm.c"
# 1 "sysdep.h" 1
# 23 "sysdep.h"
# 1 "./../include/alloca-conf.h" 1
# 16 "./../include/alloca-conf.h"
# 1 "./config.h" 1 3 <---- now the correct 'config.h' is included
# 17 "./../include/alloca-conf.h" 2
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/binutils> make
... <everything compiles without error> ...
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25/binutils> cd ..
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25> make
... <everything compiles without error> ...
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25> make check
... <all tests pass> ...
address@hidden:/opt/gcc-4.9.3/binutils/binutils-2.25> make install
... <everything is installed> ...