ld 检测格式不一致

Inconsistent format detection by ld

提问人:Akarys 提问时间:5/19/2021 更新时间:5/19/2021 访问量:101

问:

我正在编写一个自定义引导加载程序(就像互联网上的许多人似乎实际上在做:D一样),为了它而没有任何库。

这是我的目标设置:

  • 第一个扇区是用 asm(16 位模式的 Nasm i386)编写的,在代码中称为引导加载程序。它将使用 BIOS 加载下一个扇区并跳转到名为 的标签。bootram_entry
  • 任意数量的扇区(现在硬编码为一个)由 Rust 代码(自定义目标,使用 LLVM 目标 i386-unknown-none-code16)组成,并将负责设置基本服务并加载内核。它被称为 bootram,指的是 Linux 项目中的 initramfs。
  • 这两个对象是使用各自的工具编译的,正如您在 Makefile(帖子底部的 GitHub 链接)中看到的那样。它们针对格式,因为从我能收集到的信息来看,当 x86_64 CPU 处于 16 位真实模式时,这似乎是应该使用的格式(如果我错了,请告诉我)。如所示,它们确实具有这种格式。elf32-i386objdump -f *.o
  • 然后,使用链接器脚本 () 将这两个对象链接在一起,使用 MEMORY 部分来确保遵守0x7c00偏移量,并为引导加载程序提供对 的引用。它链接到相同的格式(),然后复制到二进制文件中,这样我就可以有一些调试符号。boot.ldbootram_entryelf32-i386objcopygdb

这里有一个问题:当运行时,引导加载程序和引导程序都正确地编译为正确的格式,但拒绝它们说它们使用了错误的架构,尽管说它们没有。 你可以在这里找到我提到的内容的屏幕截图:make buildldobjdump

output screenshot

源代码可以在这个临时存储库中找到:https://github.com/Akarys42/bootloader/tree/wip

如果你想尝试运行它,你显然需要 binutils、nasm、rust 和 cargo (nightly) 和组件 (cargo-srcrustup component add rust-src)

任何帮助将不胜感激!先谢谢你!

程序集 Rust 链接器错误 ld 引导加载程序

评论

2赞 Michael 5/19/2021
谷歌搜索建议您应该使用而不是 .你试过吗?-m elf_i386--oformat elf32-i386
1赞 Akarys 5/19/2021
@Michael我不知道我怎么没有找到这个;我一遍又一遍地浏览互联网,但没有找到这个解决方案。似乎它完成了这项工作,非常感谢!似乎我的程序计数器仍然有一些问题,但我想这应该是另一个问题的主题。

答: 暂无答案