Re: Compiling GCC with C and C++ for an ARM platform

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Rob Emanuele wrote:

> compiler) on a linux x86_64 host for an arm-elf target.  I would like
> to know if it is possibe to build a version of GCC with C++ for the
> arm and is arm_elf the right target?  Would I be better off using
> arm-none-eabi?  What is the difference?  Details of the error building

Well, what ABI does your target use?  If it is bare metal and uses the
old ABI, it's arm-elf, if it uses EABI it's arm-none-eabi.  If it is not
bare metal but GNU/Linux with EABI the target is
arm-none-linux-gnueabi.  The EABI makes a lot of improvements over the
OABI, notably in floating point performance, being able to mix hard and
softfloat, better syscall performance, etc.  You'll have to google for
more details.

> configure: error: No support for this host/target combination.
> make[3]: *** [configure-target-libstdc++-v3] Error 1

The problem you have run into is common.  In order to configure
libstdc++, aspects of the target's libc need to be known in order to
know what features of libstdc++ to enable.  So that's the first
question: what libc are you using?

For a native configuration, this is simple: the configure script can
perform compile, link, and execute tests to determine these things.

But it's a different story when building a cross compiler, epspecially
for bare metal targets.  These usually require things outside of the
scope of gcc in order to link: crt*.o, linker script, syscall stubs,
etc.  So the policy is that link tests aren't allowed in libstdc++
configure for crosses to bare metal.

The question remains then, how is libstdc++ to be configured?  There are
two general ways: A) --with-newlib, and B) crossconfig.m4.

If your target uses newlib then you are set, since newlib is
special-cased.  Just make sure the newlib headers are in the proper
location[1] before starting the build, and supply --with-newlib when
configuring to indicate that you're using newlib.  The rest should just
work.  (Note that there currently is a bug in 4.3 in this area that
causes it not to "just work", but there's a straightforward fix[2] for
that.) 

If you're not using newlib as your libc, then you need to specify the
characteristics of your libc in crossconfig.m4.  And in fact if you look
at that file, the default case contains a fallthrough of
"AC_MSG_ERROR([No support for this host/target combination.])", exactly
what you're seeing.

> Is this target just not complete or is it obselete?

Neither.  It's just that you can't expect libstdc++ to configure itself
with no information on the target libc.

> The other constraint for building is that I must disable libssp when I
> configure GCC.  Without disabling libssp the compile/config produces
> these warnings and eventually fails:

Yes, that's a deficiency that should probably be improved, but the
--disable-libssp workaround is simple enough.  If there's not a PR open
for that I'd file one.

Brian

[1] If using a sysroot, then put them in the corresponding place there,
otherwise $prefix/$target/include.  Sometimes you have to symlink
$prefix/$target/sys-include to ../include as well.  Or, you can use
--with-headers=location to spell it out explicitly.

[2] Skip AC_LIBTOOL_DLOPEN for newlib targets, see
<http://gcc.gnu.org/ml/gcc-patches/2007-11/msg01560.html> for the
general idea.

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux