2015-01-02 38 views
1

我工作在一個生鏽OS上,和我遇到下面的錯誤,當我試圖鏈接:如何提供或刪除_GLOBAL_OFFSET_TABLE_上的依賴關係?

未定義的引用「_GLOBAL_OFFSET_TABLE_」

這是由引起的,最佳正如我所知道的,任何調用另一個的Rust函數。我也有#[no_std]。我的鏈接描述文件不包括對_GLOBAL_OFFSET_TABLE_的這種引用,應該如何?

OUTPUT_FORMAT("binary") 
ENTRY(start) 
phys = 0x0010000; 
SECTIONS 
{ 

    .text phys : AT(phys) { 
    code = .; 
    *(.text) 
    *(.rodata) 
    . = ALIGN(4096); 
} 
.data : AT(phys + (data - code)) { 
    data = .; 
    *(.data) 
    . = ALIGN(4096); 
} 
.bss : AT(phys + (bss - code)) { 
    bss = .; 
    *(.bss) 
    . = ALIGN(4096); 
} 
end = .; 
} 

>nasm -f aout -o start.o start.asm 
>rustc -O --target i686-unknown-linux-gnu --crate-type lib -o main.o --emit obj main.rs 
>ld -melf_i386 -Tlink.ld -o kernel.bin start.o main.o 
main.0.rs:(.text.main+0xb): undefined reference to '_GLOBAL_OFFSET_TABLE_' 
>nm main.o   
     U _GLOBAL_OFFSET_TABLE_ 
00000000 T main 
00000000 T memcmp 
... 

建立怎樣包括這個符號?有沒有辦法消除我對它的依賴?與Makefile文件完整的代碼是在這裏如果有人想嘗試建立它:https://github.com/ragingSloth/rustboot

+0

我認爲這聽起來很熟悉。你應該包含一個鏈接到[你開的鏽問題](https://github.com/rust-lang/rust/issues/20379),然後關閉。 – Shepmaster

+0

我還沒有看到關於搬遷模型的最後一篇文章haha – ragingSloth

回答

2

根據你打開了鏽的問題這兩個意見:

如果你不想讓PIC或動態無-pic重定位模型,那麼你應該要求靜態模型。

而且

搬遷模型可以通過-C relocation-model=...參數

和檢查,看看what the global offset table is反正被控制,我認爲你需要更新你的編譯器的命令是:

rustc -O --target i686-unknown-linux-gnu --crate-type lib -o main.o --emit obj -C relocation-model=static main.rs 
+0

感謝過去幾周的所有幫助。完全做到了。 – ragingSloth