GCC with Cortex-M4 hard float link error "X uses VFP register arguments, Y does not"
Johannes Bauer
dfnsonfsduifb@gmx.de
Wed Aug 22 15:37:00 GMT 2012
Hi list,
I have a problem with gcc-4.7.1 (and g++) for ARM, specifically the
Cortex M4 (Thumb2 variant). I've compiled it with newlib and multilib
support and am now trying to get hard float running, with no success so
far. Showing that multilib is enabled:
$ arm-none-eabi-g++ -print-multi-lib
.;
thumb;@mthumb
fpu;@mfloat-abi=hard
I compile with
arm-none-eabi-gcc -Wall -O2 -g -mcpu=cortex-m4 -mfloat-abi=hard -mthumb
-std=c99 -c -o foo.o foo.c
Compiling the modules works fine and hard float instructions are generated:
0000013c <floattest(float)>:
13c: ed9f 7b08 vldr d7, [pc, #32] ; 160
<floattest(float)+0x24>
140: eeb7 0ac0 vcvt.f64.f32 d0, s0
144: ee20 0b07 vmul.f64 d0, d0, d7
148: ed9f 7b07 vldr d7, [pc, #28] ; 168
<floattest(float)+0x2c>
14c: eeb7 0bc0 vcvt.f32.f64 s0, d0
150: eeb7 0ac0 vcvt.f64.f32 d0, s0
154: ee30 0b07 vadd.f64 d0, d0, d7
158: eeb7 0bc0 vcvt.f32.f64 s0, d0
15c: 4770 bx lr
15e: bf00 nop
160: e631f8a1 .word 0xe631f8a1
164: 40c81cd6 .word 0x40c81cd6
168: 692b3cc5 .word 0x692b3cc5
16c: 3f5437c5 .word 0x3f5437c5
When it comes to linking, however, this is a different story. For each
module "m" and the final ELF target "t" I get a message:
[...]/bin/arm/lib/gcc/arm-none-eabi/4.7.1/../../../../arm-none-eabi/bin/ld:
error: m.o uses VFP register arguments, t does not
[...]/bin/arm/lib/gcc/arm-none-eabi/4.7.1/../../../../arm-none-eabi/bin/ld:
failed to merge target specific data of file m.o
I'm guessing it's trying to link newlib stuff in from the libcrt* which
might not be compiled with hard float, can that be correct? Then why
would gcc's multilib show the correct strings? Could somebody please
explain to me what I'm doing wrong?
Thank you very much,
Joe
More information about the Gcc-help
mailing list