Dan*_*ker 6 linker relocation osdev rust
我有一个带有两个绝对符号的内核的链接描述文件:_kernel_start和_kernel_end.但是,我只收到链接器重定位错误_kernel_end:
In function `kernel::mem::mm::setup_memorymap':
/home/virtlink/kernel/src/mem/mm.rs:25:(.text._ZN3mem2mm15setup_memorymap):
relocation truncated to fit: R_X86_64_PC32 against symbol `_kernel_end'
defined in *ABS* section in ./kernel.bin
Run Code Online (Sandbox Code Playgroud)
这里有很多关于这个错误的问题,但我没有找到解决我特定问题的问题.
显然,这个:
_kernel_start = .;
Run Code Online (Sandbox Code Playgroud)
...被视为32位,而这:
. += KERNEL_BASE;
_kernel_end = . - KERNEL_BASE;
Run Code Online (Sandbox Code Playgroud)
...被视为64位.如果我将_kernel_end符号移动到. += KERNEL_BASE线上方,如下所示:
_kernel_end = .;
. += KERNEL_BASE;
Run Code Online (Sandbox Code Playgroud)
......然后再次运作.但我想_kernel_end在我的链接器脚本的末尾.
链接描述文件将引导代码放在内存开头,其余代码放在64位虚拟内存空间的上半部分.它看起来像这样:
OUTPUT_FORMAT(elf64-x86-64)
KERNEL_BASE = 0xFFFFFFFF80000000;
SECTIONS
{
/* Boot code at 1 MiB */
. = 1M;
_kernel_start = .;
.boot :
{
KEEP( *(.multiboot) )
*(.boot)
*(.bootdata)
}
/* Kernel code at high virtual address. */
. += KERNEL_BASE;
.text ALIGN(4K) : AT(ADDR(.text) - KERNEL_BASE)
{
*(.text)
*(.gnu.linkonce.t*)
}
.data ALIGN(4K) : AT(ADDR(.data) - KERNEL_BASE)
{
*(.data)
*(.gnu.linkonce.d*)
}
.rodata ALIGN(4K) : AT(ADDR(.rodata) - KERNEL_BASE)
{
*(.rodata)
*(.gnu.linkonce.r*)
}
.bss ALIGN(4K) : AT(ADDR(.bss) - KERNEL_BASE)
{
*(COMMON)
*(.bss)
*(.bss.*)
*(.gnu.linkonce.b*)
}
_kernel_end = . - KERNEL_BASE;
/DISCARD/ :
{
*(.comment)
*(.eh_frame)
}
}
Run Code Online (Sandbox Code Playgroud)
内核非常小,所以_kernel_start = 0x00100000和_kernel_end = 0x00142000.它不应该给我重定位错误.
如何重写链接器脚本,_kernel_end以便不再给我重定位错误?我不想只使用mcmodel=large这个符号.
这是我使用符号的代码.这是Rust.
fn get_kernel_location() -> (*const u8, *const u8) {
extern {
static _kernel_start: u8;
static _kernel_end: u8;
}
let kernel_start: *const u8 = &_kernel_start;
let kernel_end: *const u8 = &_kernel_end;
println!("{:p}", kernel_start);
println!("{:p}", kernel_end);
(kernel_start, kernel_end)
}
Run Code Online (Sandbox Code Playgroud)
以下是Rust编译对象文件的重定位表中的条目:
Offset Info Type Sym. Value Sym. Name + Addend
000000000012 058800000009 R_X86_64_GOTPCREL 0000000000000000 _kernel_end - 4
000000000019 058900000009 R_X86_64_GOTPCREL 0000000000000000 _kernel_start - 4
Run Code Online (Sandbox Code Playgroud)