我正在使用当前riscv-tools为PicoRV32内核构建固件映像。固件需要浮点,所以我使用的是-msoft-float
。这是我正在使用的编译器/链接器选项:
-Os -m32 -march=RV32I -msoft-float -ffreestanding -nostdlib -lgcc
在此配置中,__ muldf3由(根据链接器-Map
输出)提供:
/opt/riscv/lib/gcc/riscv64-unknown-elf/4.9.2/soft-float/32/libgcc.a(dp-bit.o)
但此代码与RV32I ISA不兼容:它使用MUL
和MULHU
指令!
如何获得普通RV32I ISA的软浮动?我是否需要编译自己的libgcc.a版本?是否有关于如何做到这一点的说明?
答案 0 :(得分:3)
正如您所注意到的,“-march =”标志仅影响当前的转换单元,而不影响在工具链构建时生成的库。
尽管存在用于构建工具链的“disable-atomics”/“disable-float”配置标志,但是没有用于乘法/除法的multilib选项,因为它们不会影响ABI;假设执行环境可以模拟这些指令。
最后一点,最新的Privileged ISA v1.7的设计使你可以运行mul / div代码然后陷入机器模式来模拟mul / div指令(你甚至可以陷入M模式在M模式下运行!)。您必须在M模式下提供自己的mul陷阱处理程序(可能位于您自己的crt0文件中并在编译时链接)。
我建议您尝试使用“--with-arch”标志。最近的补丁支持--with-arch标志,因此可以构建一个默认情况下不会生成乘法/除法的gcc。这将阻止libgcc包含这些指令。您可以尝试将--with-arch = RV32I添加到gcc配置行(为此,您必须在riscv-gnu-toolchain中修改Makefile.in)。