Crosscompiling for ARM926EJ-s device with hardware float operations support

Started by dannychris37 3 months ago4 replieslatest reply 3 months ago60 views

I need to cross compile c++ code for an embedded device with the specs shown below with hardware float operations support. Cross compiling from Ubuntu 20.04 without hardware float support is easy, i can just run arm-linux-gnueabi-g++ -marm -mcpu=arm926ej-s -mfloat-abi=soft -mfpu=vfp and it will work. When running with -mfloat-abi=hard I get:

/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: error: ArmSimulateStartStop uses VFP register arguments, /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtbegin.o does not
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtbegin.o
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: error: ArmSimulateStartStop uses VFP register arguments, /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtend.o does not
/usr/lib/gcc-cross/arm-linux-gnueabi/9/../../../../arm-linux-gnueabi/bin/ld: failed to merge target specific data of file /usr/lib/gcc-cross/arm-linux-gnueabi/9/crtend.o
collect2: error: ld returned 1 exit status
make: *** [Makefile:12: CrossCompile] Error 1

I know this processor supports hardware float support, it says in the arm documentation. I downloaded buildroot and crosstool but I don't know how to configure them right for my device hardware. How can I cross compile with VFP support?

Device specs:

~ $ cat /proc/cpuinfo 
Processor       : ARM926EJ-S rev 5 (v5l) 
BogoMIPS        : 197.83 
Features        : swp half thumb fastmult edsp java 
CPU implementer : 0x41 
CPU architecture: 5TEJ 
CPU variant     : 0x0 
CPU part        : 0x926 
CPU revision    : 5

~ $ cat /proc/version 
Linux version 2.6.36 (owzafs@PCOWZAFS) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) ) #464 PREEMPT Thu Apr 19 13:50:56 CEST 2018 

Question on SE:

[ - ]
Reply by BVRameshJune 15, 2020

Looks like the objects crtbegin.o and crtend.o doens not match with the main line build. I feel that the best method is to recompile crtbegin.s and crtend.s need to be recompiled with the same setting -mfloat-abi=hard, create the seperate crtbegin.o and crtend.o and retry.

BV Ramesh.

[ - ]
Reply by waydanJune 15, 2020

Could it be related to your target triple? I see you have arm-linux-gnueabi, but I think there’s another version specifically for hardware floating point: arm-linux-gnueabihf. I’m not experience with Ubuntu, but my search did turn up a g++ package that looks promising.


[ - ]
Reply by dannychris37June 15, 2020

g+-arm-linux-gnueabihf is for armv7 and up. See here and here. The one in the question is armv5(tej).

[ - ]
Reply by VadimBJune 15, 2020
Have a look at gcc-arm-none-eabi.

I've got the following V5TE-related files:


EDIT: The following command worked for me:

arm-none-eabi-gcc -marm -mcpu=arm926ej-s -mfloat-abi=hard -mfpu=vfp -lc -specs=nosys.specs -Wl, arm926ej.c

Hope this helps.