RISC-V 64gc LD 截断重定位:R_RISCV_PCREL_HI20

RISC-V 64gc LD Truncated Relocation: R_RISCV_PCREL_HI20

由于重定位被截断,我无法获取 ld 到 link 一个非常简单的程序。

(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

使用以下 linker 脚本:

ENTRY(start);
 
. = 0x80000000;
 
SECTIONS {
    .text : ALIGN(4K) {
        *(.init);
        *(.text);
    }
    .bss : ALIGN(4K) {
        *(.bss);
        PROVIDE(globalPointer = .);
    }
    .rodata : ALIGN(4K) {
        *(.rodata);
    }
    .data : ALIGN(4K) {
        *(.data);
    }
}

使用以下命令组装和 linked:

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;
}

所以我的问题并非孤立于汇编代码。

所以我找到了我的问题!

我错过了一个。在交易品种名称中。