2017-05-26 48 views
1

下面的代碼在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 =大,然後用這個鏈接腳本,我得到「搬遷截斷鏈接它的一切在bin/kernel.elf中的.data節中定義符號end_ctors的R_X86_64_32S「和end_ctors中的相同。 我不知道爲什麼。我可以以某種方式將它設置爲使用64位地址? -mcmodel = large應該覆蓋這個,不是嗎?

+1

如果你已經回答了你自己的問題,那太棒了!但是,請將答案作爲實際答案,而不是對您的問題進行編輯。這樣,其他人很快就知道這個問題已經得到解答。 – fuz

回答

0

通過使用固定它:而不是

mov r8, end_ctors 
cmp rbx, r8 

cmp rbx, end_ctors 

與同爲end_dtors。