【问题标题】:RISC V assembly alignment errorsRISC V 装配对齐错误
【发布时间】:2021-05-18 19:06:09
【问题描述】:

我正在尝试使用 Spike RISC-V 模拟器和 pk 内核构建类似 Forth 的线程解释语言 (TIL)。我正在使用 riscv64-unknown-elf-gcc 来构建 ELF。

我在对齐方面遇到了很多问题 - 我认为代码应该是八字节对齐的,有一段时间我通过在头生成宏中添加一个 nop 来解决这个问题(对于那些不知道 TIL 的人,命令通常由具有标准结构的程序集块构建 - 我正在使用宏来生成结构。

我刚刚扩展了很多代码 - 添加了更多关键字等 - 对齐问题又回来了。例如:

riscv64-unknown-elf-gcc -o riscyforth riscyforth.S
...... /../lib/gcc/riscv64-unknown-elf/8.3.0/../../../../riscv64-unknown-elf/bin/ld: /tmp/ccpobhjr.o(.text+0x679): 7 bytes required for alignment to 8-byte boundary, but only 6 present
..... /../lib/gcc/riscv64-unknown-elf/8.3.0/../../../../riscv64-unknown-elf/bin/ld: can't relax section: bad value
collect2: error: ld returned 1 exit status

这是生成函数头的宏:

.macro CODEHEADER Name, PrevName, flags
.balign 8
TIL_\Name:
        .4byte  \flags
        .4byte  \Name
ptr_\PrevName:
        .4byte TIL_\PrevName
length_ASCII_\Name:
        .4byte end_\Name - beg_\Name
beg_\Name:
        .ascii "\Name" 
end_\Name:
        .balign 8
\Name:
.endm

可执行代码从 \Name 开始,这是我试图保证 8 字节对齐的地方 - 例如,一个典型的函数可能看起来像(这个将 1 放入堆栈):

           CODEHEADER 1, DOT
            li t0, 1
            PUSH t0
            tail NEXT

li t0, 1 将在\Name 中找到,其中名称为1

有没有办法保证这种对齐?我在在线文档中找不到任何内容,但想知道这里是否有任何用户有启发式方法?

【问题讨论】:

  • 我有点困惑; .balign 8 应该已经保证对齐。
  • 我就是这么想的!

标签: assembly memory-alignment riscv


【解决方案1】:

我是这样解决这个问题的:

.balign 8

似乎工作正常,但它不能保证我的 FORTH 中的所有指令都正确对齐,因为(如果你熟悉 FORTH/TIL,这比你不熟悉更有意义)函数头有变量size 函数名称等后面是不一定对齐的实际代码。

我通过为函数名称留出固定大小并确保代码在对齐的地址上再次启动来解决此问题。我还在每个函数的开头发出一个 nop 以确保每个函数都从一个对齐的地址开始。这是宏:

.macro CODEHEADER Name, PrevName, flags
nop
TIL_\Name:
        .4byte  \flags
        .4byte  \Name
ptr_\PrevName:
        .4byte TIL_\PrevName
length_ASCII_\Name:
        .4byte (end_\Name - beg_\Name) + 1
beg_\Name:
        .ascii "\Name"
end_\Name:
        .fill (24 - (end_\Name - beg_\Name)), 1, 0xFF
\Name:
.endm

【讨论】:

    【解决方案2】:

    我正在使用

    // set start reverse linked list
    // trick adapted from amforth-6.9
    99:
    .word 0
    
    .macro header name, label, flags=0x0
    is_\label:
        .p2align 1, 0x00
        .word 99b
    99:
        .byte \flags
        .byte (3f - 2f) 
    2:
        .ascii "\name"
    3:
        .p2align 2, 0x20    
    \label:
    .endm
    

    可以重新排序:)

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 1970-01-01
      • 2016-04-29
      • 2018-11-22
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多