【发布时间】:2021-12-29 21:12:08
【问题描述】:
由于重定位被截断,我无法让 ld 链接一个非常简单的程序。
(init+0x0): relocation truncated to fit: R_RISCV_PCREL_HI20 against symbol `globalPointer' defined in .bss section in out/bootloader.elf
产生此问题的示例程序集文件:
.section init
.global start
.type start, @function
start:
la gp, globalPointer
.end
使用以下链接器脚本:
ENTRY(start);
. = 0x80000000;
SECTIONS {
.text : ALIGN(4K) {
*(.init);
*(.text);
}
.bss : ALIGN(4K) {
*(.bss);
PROVIDE(globalPointer = .);
}
.rodata : ALIGN(4K) {
*(.rodata);
}
.data : ALIGN(4K) {
*(.data);
}
}
用以下命令组装和链接:
riscv64-elf-as -march=rv64gc source/entry.s -o build/entry.o
riscv64-elf-ld -nostdlib -melf64lriscv -T linker.ld build/entry.o -o out/bootloader.elf
使用由以下工具组成的工具链,其中 --target=riscv64-elf 作为配置参数并遵循其他标志 here at OsDev。
binutils: 2.37
gcc: 11.2.0
我也试过this prebuilt toolchain from kernel.org。
我还能够使用以下代码在 C 文件中触发相同的错误:
#include <stdint.h>
extern volatile uint64_t* globalPointer;
int kernalMain(void){
*globalPointer = 0;
return 0;
}
所以我的问题并不局限于汇编代码。
【问题讨论】:
-
刚刚尝试了另一个预编译的工具链,同样的问题。 PIC/PIE 错误消失了,但我无法链接它,因为 ld 说它不受支持。
标签: ld riscv bare-metal