0

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

4

2 回答 2

1

即使您使用 rv64imafd 标志进行编译,如果您链​​接到使用 rv64imadfc 编译的库(或 crt 文件),您的可执行文件也可以是 rv64imadfc。
这似乎是因为即使您编译为 rv64imafd,您的最终可执行文件也包含 c 标志。
如果您正在使用https://github.com/riscv/riscv-gnu-toolchain
构建默认以 rv64gc 为目标,那么您将链接到 rv64gc 库。如果您使用了 --enable-multilib,您将链接到 rv64imafdc。

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

  • 使用 nostdlib 和 nostartfiles 选项并手动传递必要的文件(使用 rv64imafd 编译)。
  • 建立一个工具链-march=rv64imafd -mabi=lp64d
  • 修改t-elf-multilib以生成 rv64imafd 并使用--enable-multilib选项构建工具链。
于 2020-08-27T20:38:51.310 回答
0

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
  ...
于 2020-07-29T09:50:45.810 回答