GCC: include math.h function in bare-metal software on ARM (arm-none-eabi-gcc)

1.3k Views Asked by At

I am working on a bare-metal free standing software on a STM32H753. I'm not using neither the libc nor the crt.

Here is the link command line:

arm-none-eabi-gcc -T"xxx.ld" -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -ffreestanding -nostdlib -nostartfiles --specs=nosys.specs -Wl,--start-group -lc -lm -Wl,--end-group -Wl,-Map=xxx.map -o xxx.elf <list of .o>

Now I need to include math library since I am using sqrt function. i thought the link command line would be sufficient but I get a "sqrt undefined" error.

I tried to add the path to the libm.a: (also tried without -Wl)

arm-none-eabi-gcc -T"xxx.ld" -Wl,-L/opt/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi/lib/ -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -ffreestanding -nostdlib -nostartfiles --specs=nosys.specs -Wl,--start-group -lc -lm -Wl,--end-group -Wl,-Map=build_uP1/base_gen_uP1.map -o build_uP1/base_gen_uP1.elf <list of .o> But I still get the same error.

I don't understand what options to choose to link with the correct library

1

There are 1 best solutions below

1
On

Sorry for this self answer but I think I 've found the solution.

  • my first mistake is that the library must be put at the end of the command line. the order of arguments does matter.
  • then there are many versions of libm.a in the gcc install so I had to pick the right one

The following line is working:

arm-none-eabi-gcc -T"xxx.ld" -L/opt/gcc-arm-none-eabi-10-2020-q4-major/arm-none-eabi/lib/thumb/v7+fp/hard/ -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -ffreestanding -nostdlib -nostartfiles --specs=nosys.specs -Wl,-Map=xxx.map -o xxx.elf <list of .o> -lm -lc

I've noticed that one symbol and some data from libc.a are needed: __errno, and impure_data