如何提供或删除对 _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
我正在用 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