This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: gcc 3.3.5 arm-elf .. which multilib for soft-float?
- From: "Joel Sherrill <joel at OARcorp dot com>" <joel dot sherrill at OARcorp dot com>
- To: Richard Earnshaw <rearnsha at gcc dot gnu dot org>
- Cc: gcc at gcc dot gnu dot org, Ralf Corsepius <ralf_corsepius at rtems dot org>
- Date: Tue, 02 Nov 2004 06:24:21 -0600
- Subject: Re: gcc 3.3.5 arm-elf .. which multilib for soft-float?
- Organization: OAR Corporation
- References: <4186D307.40203@OARcorp.com> <1099392983.11478.104.camel@pc960.cambridge.arm.com>
- Reply-to: joel dot sherrill at OARcorp dot com
Richard Earnshaw wrote:
On Tue, 2004-11-02 at 00:21, Joel Sherrill wrote:
Hi,
It looks like btween gcc 3.3.3 and 3.3.5, the file config/arm/t-arm-elf
was reworked. I am getting linking errors which indicate that the
default libc.a is hard-float.
The gcc documentation states that -mhard-float is the default for the
compiler and I only see these libc.a's
-mhard-float has *never* been the default for the arm-elf
configuration. In fact, AFAIK the only supported configuration of gcc
on ARM that still uses the FPA hard-float format is Linux.
I rather suspected this because I didn't recall any RTEMS user CPU model
I had ever looked at having hard float.
But the gcc documentation states that hard-float is ALWAYS the default:
`-mhard-float'
Generate output containing floating point instructions. This is
the default.
`-msoft-float'
Generate output containing library calls for floating point.
*Warning:* the requisite libraries are not available for all ARM
targets. Normally the facilities of the machine's usual C
compiler are used, but this cannot be done directly in
cross-compilation. You must make your own arrangements to provide
suitable library functions for cross-compilation.
`-msoft-float' changes the calling convention in the output file;
therefore, it is only useful if you compile _all_ of a program with
this option. In particular, you need to compile `libgcc.a', the
library that comes with GCC, with `-msoft-float' in order for this
to work.
./lib/thumb/libc.a
./lib/libc.a
Hard float doesn't (can't) work with Thumb (there are no instructions to
access the co-processor space). Building the hard-float libraries is
disabled by default because virtually nobody wants them (why would they?
soft-float code runs faster when you don't have an FPA, and the only
chip to have that was the ARM7500FE).
OK. I suspected that about the FPA and Thumb.
Given all that, why can't I link code when I use the -msoft-float flag.
From your description, it is redundant but it results in a string
of link errors like this:
/../../arm-rtems4.7/bin/ld: failed to merge target specific data of file
/opt/rtems-4.7/lib/gcc-lib/arm-rtems4.7/3.3.5/libgcc.a(_pack_sf.o)
$ cat j.c
#include <math.h>
float f( float x)
{
return sin(x);
}
$ /opt/rtems-4.7/bin/arm-rtems4.7-gcc j.c -O2 -lm
# WORKS
$ /opt/rtems-4.7/bin/arm-rtems4.7-gcc -msoft-float j.c -O2 -lm
# FAILS with ERRORS
Shouldn't specifying -msoft-float still result in a correct
program that links. Specifying CPU FLAGS which match the default
multilib should still work.
--joel