[megoldva] beágyazott matek

Fórumok

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.
 

Hozzászólások

Szerk: a legelejéről lemaradt, de persze a klasszik -lm opcióval is probálkoztam :] Azaz a "csak úgy simán linkelem" az ezt (is) takarja.

Szerkesztve: 2024. 01. 06., szo – 12:59

Igen, de a `-lm` a parancs végére kell. `gcc -o whatnot whatnot.c -lm`

Ah, koszi, igen, lehet hogy tenyleg csak ennyi volt hogy a vegere kellett a -lm es nem a linker-opciok kozepette :/ 

Szerk: igen, kicsit rendbetettem a felteteleket amik a LDFLAGS-eket generaljak, es igy mar (talan) jobban atlathato hogy tenyleg csak ez a faek egyszeru dolog kellett :] Mindenesetre a tanulsag megvan (i.e. annak ellenere hogy a specs, az architektura/abi definiciok es a linker defsym-ek sorrendje nem annyira intuitiv, a linkelendo konyvtarak itt kovetik a jol megszokott logikat es ezelobbi katyvasz nem szabad hogy megzavarjon senkit sem).

Cross-compile, vagy magan a RISC-V gepen probalkozol? Elobbi meglehetosen maceras szokott lenni, utobbi kevesbe, (mert masok jellemzoen mar jartak elotted arra). Csak erdekessegkepp, milyen kutyu?

A strange game. The only winning move is not to play. How about a nice game of chess?

Ez absz cross compile - szoval freestanding rendszer kell. A -lm az ezert is csak egy ovatos teszt volt, mert azt ugye inkabb hostcc/sharedlib rendszerekben szokas :)

Csak erdekessegkepp, milyen kutyu?

Teljesen saját, FPGA-s SoC. Szoval nagy a szabadsag a hardveres kialakitásban ugyan - de abszolute off-the-shelf, minél hordozhatóbb build toolchaint akarunk használni. Pont innen is indult a kérdés.