虚拟地址空间中的全局构造函数

时间:2017-05-26 20:56:50

标签: assembly linker linker-errors

在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应该涵盖这个,不应该吗?

1 个答案:

答案 0 :(得分:0)

使用以下方法修正了它:

mov r8, end_ctors
cmp rbx, r8

而不是:

cmp rbx, end_ctors

对于end_dtors也一样。