【问题标题】:Cheating with the gp register on RISC-V - what could go wrong?在 RISC-V 上使用 gp 寄存器作弊 - 会出什么问题?
【发布时间】:2022-06-15 20:30:20
【问题描述】:

对于某些 RISC-V 代码,我绝对必须将初始化值传递给动态库/模块(一切都用汇编编写)。我似乎能够做到这一点的唯一方法是使用 gp 寄存器 - 我正在使用的代码运行并且没有崩溃(还)。它用于传递存储几个初始化值的堆栈的值。

 70         PUSH gp
 71         mv gp, s10
 72         call dlopen
 73         POP gp

PUSHPOP 是我的主要堆栈宏,s10 指向我用来存储初始化值的堆栈)。一切都在 GNU libc/libdl 之上运行。

我尽可能快地恢复gp 的值:一切都说永远不要改变这个寄存器的值——所以可能出了什么问题,或者如果它有效,我可以放松一下吗?

【问题讨论】:

  • 为什么不改用at 寄存器之一?
  • 因为它们是由操作系统操作的,所以当我们在库本身中出现时,调用代码中输入的值不会被保留。
  • 如果您启用了中断,并且中断使用 GP 访问全局数据,那么事情将无法正常工作。

标签: riscv


【解决方案1】:

答案是编写一些库代码,允许访问读取和写入保存该值的内存位置。所以编写器(主要可执行文件)可以写入地址,然后读取器(需要地址的库)根据需要读取它。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2020-08-27
    • 2020-04-18
    • 1970-01-01
    • 2021-05-03
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多