【问题标题】:Differentiating between rv64imafd and rv64imafdc isa区分 rv64imafd 和 rv64imafdc isa
【发布时间】:2020-11-18 14:52:20
【问题描述】:

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

【问题讨论】:

    标签: riscv objdump spike


    【解决方案1】:

    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
      ...
    

    【讨论】:

    • 我有 2 个可执行文件,并且都启用了相同的标志,但其中一个正在执行并在 imafd 板上给出“非法指令”错误。
    • 如果可执行文件是 ELF 格式,您是否尝试过查看 readelf?它们可能都有 RVC 标志,但实际上只有一个使用压缩指令。在这种情况下,您可能希望更改/添加选项到您的编译中,以摆脱应该确保不存在压缩指令的标志。
    【解决方案2】:

    即使您使用 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 选项构建工具链。

    【讨论】:

    • 是的,你是对的。自从我与 Yocto 合作以来,我选择了第二个选项。以下是我的做法 [它] (stackoverflow.com/questions/63127165/…)
    • 乐于助人。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 2010-11-25
    • 2011-01-15
    • 2013-06-09
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多