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.
- 719 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
Igen, de a `-lm` a parancs végére kell. `gcc -o whatnot whatnot.c -lm`
- A hozzászóláshoz be kell jelentkezni
Úgyérted, hogy kell az a -Wl,-oslib=m _is_ és az -lm _is_? Na, ezt így nem probáltam ki, de megnézem ha vissza(t)értem.
- A hozzászóláshoz be kell jelentkezni
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).
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni