如何提供或删除对_GLOBAL_OFFSET_TABLE_的依赖?

时间:2015-01-02 21:46:24

标签: linker operating-system rust

我正在使用Rust中的操作系统,当我尝试链接时遇到以下错误:

  

未定义引用'_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
... 

如何添加此符号?有没有办法消除我对它的依赖?如果有人想尝试构建它,那么Makefiles的完整代码就在这里:https://github.com/ragingSloth/rustboot

1 个答案:

答案 0 :(得分:2)

根据Rust问题中的这两条评论,您打开了:

  

如果您不想要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