verilator 链接nemu动态库

  nemu本身自带了将自己编译为动态库的功能,在menuconfig->build target里选择shared  object即可。
  在编译完成后,build文件夹里就会出现riscv32-nemu-interpreter-so这个库。首先可以用file命令检查文件,只要返回信息是lsb,shared相关 即表示库正常。(一般这一步应该也不会出什么问题)
  在编译好库以后,最好按照规范,给动态库改名,前缀增加lib,再加上.so文件名后缀,否则链接器有可能找不到。

  这一部分完成后,再看npc这一边。首先需要明确,verilator不是gcc,不能直接像gcc一样加-L -l这些参数。想要正确链接到nemu动态库,在原本的verilator指令里新增一个--LDFLAGS ""  再在引号里加入需要传递给g++的链接参数。-LDFLAGS 选项用于指定链接器的选项,-L./nemu/build 指定了动态库的路径,-lriscv32-nemu-interpreter-so 是链接的库名(不需要前面的 lib 和后面的 .so 后缀)。

  比如,此时我们需要链接build里的nemu库,就写-LDFLAGS="-L./nemu/build -lriscv32-nemu-interpreter-so"  。如果路径不对,也可以考虑用绝对路径。 注意:链接器-l参数,虽然没有写lib和.so后缀,但是链接器在寻找时会按照有前后缀的名字去查找。如果找不到库文件,就mv修改动态库文件名。

  在源代码方面,仿真用的是c++,所以在设置头文件,声明nemu 的difftest相关函数时,需要用extern "C"去声明。

-------------------------

期间遇到的bug:

1. error while loading shared libraries 找不到库文件:参考上面的,链接器会去/lib/ /usr/lib/这些地方寻找库。可以选择直接把nemu库放到这些目录,但也可以选择在链接命令里声明:在LDFLAGS参数里继续增加"-Wl,-rpath,nemu库路径"即可。

2. nm指令可以查看库里面的符号信息。在此处可以用nm -D riscv32-nemu-interpreter-so去检查,只有显示地址信息的符号才是被暴露出来可使用的。配合grep可以筛选。比如nm -D riscv32-nemu-interpreter-so | grep difftest_regcpy   查找动态库里difftest_regcpy相关符号。

3. ldd指令可以查看程序依赖的库是否正确找到。对Vtop使用ldd,查看链接是否有问题:

  在这里就明显可以看到未找到对应库,参考第一条。

4. asan.so 库报错(即address sanitize)

ASan runtime does not come first in initial library list; you should either link runtime to your application or manually prelo
ad it with LD_PRELOAD. 

。出现此错误是因为nemu的编译选项里勾选了address sanitize。这个库对加载顺序有要求。ldd /build/Vtop查看,如果不是排在前面就可能报错。如果不需要这个功能,在menuconfig里关闭,重新编译nemu库。编译好以后,用

nm -D nemu/build/libriscv32-nemu-interpreter-so.so | grep asan 来查看是否还包含此符号。不返回内容即表示成功。
  或者也可以选择继续保持此功能,但是LDFLAGS参数里需要继续增加一条-sanitize=address启用。否则会
出现undefined reference to `__asan_report_store4` 这样的错误,说明nemu库包含AS功能,但是npc中未正确启用,导致报错。但我认为现阶段会触发越界的问题不多,pmem和difftest足够拦截到错误信息了。

posted @   namezhyp  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
历史上的今天:
2020-12-03 定点数和浮点数在计算机中的表示
点击右上角即可分享
微信分享提示