RISC V组件对准错误



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

我在对齐方面有很多问题-我相信代码应该是8字节对齐的,有一段时间我通过在头生成宏(对于那些不知道TILs的人来说,命令通常是由具有标准结构的汇编块构建而成的-我正在使用宏来生成结构。

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

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中找到,其中Name为1

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

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

.balign 8

确实看起来工作正常,但它并不能保证我的FORTH中的所有指令都正确对齐,因为(如果你熟悉FORTH/TILs,这比你不熟悉更有意义)函数头具有可变大小的函数名称,因此后面跟着不一定对齐的实际代码。

我通过为函数名设置固定的大小来解决这个问题,并确保代码在对齐的地址上重新开始。我还在每个函数的开始处发出一个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

我使用

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

可以重新排序:)

使用pad作为。p2align 4, 0x20RISCV中的cell大小必须为4字节

最新更新