当我使用 riscv64-unknown-elf-gcc 时,选项
-march=rv64g
和 -march=rv64gc
之间几乎没有区别。
-march=64g
会尽量在标准库函数中使用RVC代码,例如prinft,但不会在我自己的函数中使用。而-march=64gc
,在两种类型的功能中使用RVC代码。
我不知道这是不是默认的。但是如果我想禁止RVC代码,即使在没有RVC代码的标准库函数中,我该怎么办?
使用选项重新编译 riscv-gnu-tool
--with-arch=rv64g --disable-multilib
我在 RISC-V 硬件上使用了以下
gcc
(11.3.0)和 clang
(17.0.0)(uarch
的底层 sifive,u74-mc
和 isa
的 rv64imafdc
)来使用未压缩的 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.
。
最后请注意,可执行文件与标准库链接,这些库可能是在支持
c
扩展的情况下编译的。您可以使用 -M no-aliases
到 objdump -D
以及看起来像 c.beqz
、c.addi
等的说明来确认这一点