RISC-V alá próbálom itten beizzítani a klasszikus matek könyvtárakat, egyelőre inkább kevesebb mint több sikerrel. Konkértan az van hogy sima integer architektúra alatt használnám (pl) az sqrtf() függvényt. Ha csak úgy simán linkelem, akkor nem találja:
main.c:(.text+0x116): undefined reference to `sqrtf'
Ha kézzel hozzáadom a megfelelő libm.a file-t a teljes path-tal (/usr/lib/picolibc/riscv64-unknown-elf/lib/rv32imac/ilp32/libm.a, itt konkrétan), akkor sem találja. Ha ebből a libm.a-ból kiveszem a megfelelo *.o-t (ef_sqrt.c.o, ebben van a T: sqrtf szimbolum), azt adom hozzá linkelés során akkor minden fasza. Szoval azért nem rossz a helyzet, de ez így minden csak nem elegáns, pláne nem hordozható.
A megfelelő specs file-ban (picolibc.specs: /usr/lib/picolibc/riscv64-unknown-elf/picolibc.specs) van egy ilyen sor:
--start-group %(libgcc) -lc %{-oslib=*:--undefined=_exit} %{-oslib=*:-l%*} --end-group
Ezen felbuzdulva a linerknek átadtam a -Wl,-oslib=m opciót, mondván hogy a {-oslib=*:-l%*} direktíva a -lc-hez meg az -lgcc (libgcc)-hez hasonlóan akkor hozzáadja a -lm-et is. De sajnos ez sem elég, ugyanúgy undefined reference to `sqrtf' lesz a vége, pedig ez mig egy vállalhatóan kultúrált/hordozható opció lehetne:
riscv64-unknown-elf-gcc \
-march=rv32imac -mabi=ilp32 \
-Wl,-oslib=m -specs=/usr/lib/picolibc/riscv64-unknown-elf/picolibc.specs \
-Wl,--defsym=__ram=0x20000000 -Wl,--defsym=__ram_size=0x10000 -Wl,--defsym=__stack_size=0 \
-T./picolibc_ram.ld \
-o main.elf main.o vector.o rtos/libfreertos.a
Ugyan a newlib-et nem próbáltam ki, de azt látom hogy akár ARM-nél is teljesen hasonlóan megy a minden. Szoval (feltételezem) hogy ARM-nál (arm-none-eabi-gcc) is ezt és/vagy ilyesmit kéne csinálni (ha pl. Cortex-M0 alatt akarnánk floating point math library-t használni).
Bármi ötlet? Thx, A.