【问题标题】:Connecting linker script with assembly file [risc-v]将链接描述文件与程序集文件 [risc-v] 连接
【发布时间】:2021-01-02 09:34:26
【问题描述】:

我正在使用RISC-V compiler,我需要将我的链接描述文件“变量”连接到汇编文件指令,例如:

在我的链接器脚本 (.ld) 中有这一行:

ENTRY(_start)
_estack = 0x1FFFC;    /* end of RAM */
...

因此,我需要在我的 start.S 文件中创建一个汇编指令,如下所示:

li sp, _estack

我尝试了很多东西,比如:

.word _estack
# - or -
.global _estack

li sp, _estack

但它们似乎都不起作用,它会发出以下消息:

App/src/start.S: Assembler messages:
App/src/start.S:59: Error: illegal operands `li sp,_estack'
make: *** [build/start.o] Error 1

关于上下文,这是我的 start.S 文件:

.global _start

.section .text.prologue, "ax"

.word _estack
# .global _estack


_start:
    li sp, _estack
    jal  ra, main
    j _exit

_exit:  j _exit

【问题讨论】:

  • 为什么是 0x1FFFC 而不是 0x20000?你是在为某事保留最后的记忆吗?

标签: assembly linker linker-errors riscv


【解决方案1】:

这是那些“试一试”的事情之一。

extern unsigned int _estack;
unsigned int fun ( void  )
{
    return(_estack);
}

假设 gcc 检查编译器输出

fun:
    lui a5,%hi(_estack)
    lw  a0,%lo(_estack)(a5)
    ret

所以,对于 gnu 汇编器(汇编语言特定于工具而不是目标)

lui x15,%hi(_estack)
lw  sp,%lo(_estack)(x15)

_estack = 0x1FFFC;
MEMORY
{
    ram : ORIGIN = 0x00000000, LENGTH = 0x1000
}
SECTIONS
{
    .text : { *(.text*) } > ram
}

Disassembly of section .text:

00000000 <.text>:
   0:   000207b7            lui x15,0x20
   4:   ffc7a103            lw  x2,-4(x15) # 1fffc <_estack>

这也应该有效:

lui sp,%hi(_estack)
addi sp,sp,%lo(_estack)

还有ori。

就像任何其他常量一样,您需要从 lui 开始设置高位,然后您可以在其他指令中处理低位。汇编器可能有一个伪指令来选择解决方案(例如,如果常量是 0x12340000,你只需要 lui)。但假设伪指令特定于汇编程序而不是目标。

【讨论】:

  • li 是通常想要在这里使用的伪指令,但它似乎不适用于简单的 li sp,_estack 所以可能需要更多语法。我对整个将堆栈放在链接器中的问题有疑问,但 YMMV。如果是我,我会简单地 lui sp,0x20 或 lui sp,0x20000>>12 如果语法支持它。 (这不是一个意愿,这实际上是我为 risc-v 做的)。 YMMV
  • 请注意,只需几秒钟的谷歌搜索即可找到答案。我不需要花时间在使用 C 编译器上,即使这样也能找到答案。
  • 另请注意,股票 gcc 和 binutils 源现在包括 risc-v。
【解决方案2】:

在您的 crt0 文件中,您需要将:li sp, _estack 替换为 la sp, _estackli 仅用于即时,因为_estack 是您必须使用la 的符号。

您需要在链接描述文件中提供符号,否则您将收到未定义的引用错误。替换
_estack = 0x1FFFC; /* end of RAM */
PROVIDE(_estack = 0x1FFFC); /* end of RAM */.

【讨论】:

    猜你喜欢
    • 2021-01-31
    • 2018-11-15
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2011-12-11
    相关资源
    最近更新 更多