rv64imafd 和 rv64imafdc isa 的区别

Differentiating between rv64imafd and rv64imafdc isa

如何在不执行 rv64imafd 和 rv64imafdc 二进制文件的情况下区分它们?我使用很少的编译器标志来更改扩展,但我不确定如何验证它。我不想每次都转储可执行文件以在我的 imafd 板上进行测试。
我尝试研究这两个文件的 objdump,即使操作码之间存在明显差异,但这还不够。 如果我可以分享更多这方面的信息,请告诉我。

objdump 或执行同等级别解码的程序可能需要确认二进制文件中不存在压缩指令。但是,如果在启用压缩指令的情况下编译,则由 GNU 工具链制作的 ELF 可执行文件使用 elf 二进制文件的标志进行编码。

$readelf -h no_compressed.o 
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  ...
  Flags:                             0x4, double-float ABI
  ...
$ readelf -h compressed.o 
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  ...
  Flags:                             0x5, RVC, double-float ABI
  ...

即使您使用 rv64imafd 标志编译,如果您 link 到使用 rv64imadfc 编译的库(或 crt 文件),您的可执行文件也可以是 rv64imadfc。
这似乎是这种情况,因为即使您编译为 rv64imafd,您的最终可执行文件也包含 c 标志。
如果您使用 https://github.com/riscv/riscv-gnu-toolchain
该构建默认以 rv64gc 为目标,因此您 link 反对 rv64gc 库。如果你使用 --enable-multilib 你是 link 对抗 rv64imafdc.

为了生成 rv64imafd 可执行文件,您有以下三种选择:

  • 使用 nostdlib 和 nostartfiles 选项并手动传递必要的文件(使用 rv64imafd 编译)。
  • 使用 -march=rv64imafd -mabi=lp64d
  • 构建工具链
  • 修改 t-elf-multilib 以生成 rv64imafd 并使用 --enable-multilib 选项构建工具链。