0

我试图将平淡无奇的 c 代码编译为 RV32i 处理器可执行的 elf 格式。

但是,当我启用优化(-Os 或 -O2)时,生成的程序集包含我无法执行的压缩指令。我所有的自制代码都被编译成普通的 rv32i 指令,只有辅助函数*被编译成 C 指令。如何完全禁用 C 指令?

使用辅助函数我的意思是 __riscv_save_0, __riscv_restore_0, __riscv_save_4, ...

我使用编译代码

riscv32-unknown-elf-gcc $(CFLAGS) -T link.ld $(SRCS) -o $@ -lgcc

CFLAGS 为:

-g -O2 -msave-restore -mabi=ilp32 -march=rv32i --specs=nosys.specs -nostdlib -Wall -Wl,-gc-sections -ffunction-sections -ffreestanding -fno-builtin

反汇编看起来像这样 - 优化:(出于某种原因,我的所有代码都没有 C 指令,所有辅助函数都带有 C 指令)

00000174 <__riscv_save_0>:
174:    1141                    addi    sp,sp,-16
176:    c04a                    sw  s2,0(sp)
178:    c226                    sw  s1,4(sp)
17a:    c422                    sw  s0,8(sp)
17c:    c606                    sw  ra,12(sp)
17e:    8282                    jr  t0
...
00000198 <__riscv_restore_0>:
198:    4902                    lw  s2,0(sp)
19a:    4492                    lw  s1,4(sp)
19c:    4422                    lw  s0,8(sp)
19e:    40b2                    lw  ra,12(sp)
1a0:    0141                    addi    sp,sp,16
1a2:    8082                    ret
...
000001c4 <main>:
1c4:    fb1ff2ef            jal t0,174 <__riscv_save_0>
1c8:    034000ef            jal ra,1fc <func_a>
1cc:    00000537            lui a0,0x0
1d0:    00000613            li  a2,0
1d4:    00000593            li  a1,0
1d8:    1a450513            addi a0,a0,420
1dc:    098000ef            jal ra,274 <func_b>
1e0:    00000537            lui a0,0x0
1e4:    00000613            li  a2,0
1e8:    00000593            li  a1,0
1ec:    1b450513            addi a0,a0,436
1f0:    084000ef            jal ra,274 <func_b>
1f4:    154000ef            jal ra,348 <func_c>
1f8:    fa1ff06f            j   198 <__riscv_restore_0>
4

1 回答 1

0

好的,我找到了我的问题的答案。

在编译时,您可以更改要使用的架构。但是构建中使用的库是在构建工具链时生成的。

因此,我犯了使用 RV32IC 架构构建 Risc-V 工具链的错误,但希望它们仅用于 RV32I 项目。

所以解决方法是简单地用 RV32I 重新编译工具链。

于 2021-07-02T20:03:42.140 回答