我正在使用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
答案 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