spike仿真器运行简单测试c++程序容易出现的一些问题

现有如下C++测试程序:

#include <cstdio>

int main(void){
    printf("1\n");
    return 0;
}

我们想把它用riscv交叉编译器编译,有两种编译器可以选择:riscv64-unknown-elf-g++和riscv64-unknown-linux-gnu-g++

问题

如果使用的编译命令是:

riscv64-unknown-linux-gnu-g++ -o lib/test test.cpp
spike pk lib/test

就会报如下错误:

bbl loader
z  0000000000000000 ra 00000000000104dc sp 000000007f7e9b50 gp 0000000000012800
tp 0000000000000000 t0 0000000000000000 t1 0000000000000000 t2 0000000000012470
s0 0000000000000000 s1 0000000000000000 a0 0000000000010554 a1 0000000000000001
a2 000000007f7e9b58 a3 0000000000010572 a4 00000000000105ca a5 0000000000000000
a6 000000007f7e9b50 a7 0000000000000000 s2 0000000000000000 s3 0000000000000000
s4 0000000000000000 s5 0000000000000000 s6 0000000000000000 s7 0000000000000000
s8 0000000000000000 s9 0000000000000000 sA 0000000000000000 sB 0000000000000000
t3 ffffffffffffffff t4 0000000000000000 t5 0000000000000000 t6 0000000000000000
pc fffffffffffffffe va fffffffffffffffe insn       ffffffff sr 8000000200046020
User fetch segfault @ 0xfffffffffffffffe

解决方法

将编译命令后加上-static,选择静态编译

riscv64-unknown-linux-gnu-g++ -o lib/test test.cpp -static

运行:

spike pk lib/test

结果:

bbl loader
1

如果使用riscv64-unknown-elf-g++

输入的命令:

riscv64-unknown-elf-g++ -o lib/test test.cpp
spike pk lib/test

就不需要选择静态编译,输出结果为:

bbl loader
1

这是因为在riscv64-unknown-elf-g++编译器中默认就是静态编译,但是在riscv64-unknown-linux-gnu-g++编译器中需要手动指定

如果不加pk

因为printf是系统调用命令,如果不加pk的话就会报错,错误如下:

$ spike lib/test
ERROR: invalid load from debug module: 8 bytes at 0x0000000000012610
terminate called after throwing an instance of 'trap_load_access_fault'
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值