在linker.ld中执行代码:
OUTPUT_FORMAT(elf64-x86-64)
ENTRY(start)
HVMA = 0xFFFFFF0000000000;
SECTIONS
{
. = 1M;
_start = . + HVMA;
.init :
{
*(.initl)
}
. += HVMA;
.text ALIGN(0x1000) : AT(ADDR(.text) - HVMA)
{
*(.inith)
*(.text)
}
.data ALIGN(0x1000) : AT(ADDR(.data) - HVMA)
{
start_ctors = .;
*(.ctor*)
end_ctors = .;
start_dtors = .;
*(.dtor*)
end_dtors = .;
*(.data)
}
.rodata ALIGN(0x1000) : AT(ADDR(.rodata) - HVMA)
{
*(.rodata)
}
.bss ALIGN(0x1000) : AT(ADDR(.bss) - HVMA)
{
_sbss = .;
*(COMMON)
*(.bss)
_ebss = .;
}
_end = .;
}
现在,当我尝试使用-mcmodel = large编译所有内容然后将其链接到此链接描述文件时,我得到"重定位被截断以适合:R_X86_64_32S针对在bin中的.data部分中定义的符号end_ctors
/kernel.elf"和end_ctors
相同。
我不知道为什么。我能以某种方式将其设置为使用64位地址吗? -mcmodel = large应该涵盖这个,不应该吗?
答案 0 :(得分:0)
使用以下方法修正了它:
mov r8, end_ctors
cmp rbx, r8
而不是:
cmp rbx, end_ctors
对于end_dtors也一样。