当我使用riscv64-unknown-elf-gcc时,选项-march=rv64g
和-march=rv64gc
之间几乎没有区别。
-march=64g
将尽可能在标准库函数(例如prinft)中使用RVC代码,但不在我的自定义函数中使用。而-march=64gc
则在这两种类型的函数中都使用RVC代码。
我不知道这是否是默认设置。但如果我想禁止使用RVC代码,即使在没有RVC代码的标准库函数中,我该怎么做?
当我使用riscv64-unknown-elf-gcc时,选项-march=rv64g
和-march=rv64gc
之间几乎没有区别。
-march=64g
将尽可能在标准库函数(例如prinft)中使用RVC代码,但不在我的自定义函数中使用。而-march=64gc
则在这两种类型的函数中都使用RVC代码。
我不知道这是否是默认设置。但如果我想禁止使用RVC代码,即使在没有RVC代码的标准库函数中,我该怎么做?
--with-arch=rv64g --disable-multilib
。我已经在 RISC-V 硬件上使用以下内容(基于 sifive,u74-mc
的底层 uarch
,具有 rv64imafdc
的 isa
),并在 gcc
(11.3.0)和 clang
(17.0.0)上使用未压缩的 RISC-V 指令。
hello.S
:
.global main
.data
hello: .asciz "Hello, world!\n"
.text
main:
addi sp,sp,-8
sd ra,0(sp)
la a0,hello
call printf
li a0,0
ld ra,0(sp)
addi sp,sp,8
ret
gcc -march=rv64g -o hello hello.S
或者 clang -march=rv64g -o hello hello.S
。请验证您的代码是否具有未压缩的指令:
objdump -d -M no-aliases hello
...
0000000000000668 <main>:
668: ff810113 addi sp,sp,-8
66c: 00113023 sd ra,0(sp)
670: 00002517 auipc a0,0x2
674: 9d053503 ld a0,-1584(a0) # 2040 <_GLOBAL_OFFSET_TABLE_+0x8>
678: f29ff0ef jal ra,5a0 <printf@plt>
67c: 00000513 addi a0,zero,0
680: 00013083 ld ra,0(sp)
684: 00810113 addi sp,sp,8
688: 00008067 jalr zero,0(ra)
需要注意两点:指令的宽度为32位,并且它们没有前缀c.
最后请注意可执行文件链接了标准库,而这些库可能已经编译支持扩展。您可以使用-M no-aliases
到objdump -D
来确认并查看类似c.beqz、c.addi等指令。