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

How do I provide or remove the dependency on _GLOBAL_OFFSET_TABLE_?

我正在用 Rust 开发 OS,尝试链接时遇到以下错误:

undefined reference to '_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

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

If you don't want the pic or dynamic-no-pic relocation models then you should ask for the static model.

the relocation model can be controlled via the -C relocation-model=... argument

并查看 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