【问题标题】:RISC-V 64gc LD Truncated Relocation: R_RISCV_PCREL_HI20RISC-V 64gc LD 截断重定位:R_RISCV_PCREL_HI20
【发布时间】: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


【解决方案1】:

所以我发现了我的问题!

我错过了一个 .在符号名称中。

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    相关资源
    最近更新 更多