【问题标题】:Linking My OS with LD, error File not recognised: File format not recognised将我的操作系统与 LD 链接,错误文件无法识别:文件格式无法识别
【发布时间】:2017-10-14 17:20:01
【问题描述】:

我在链接文件以使我的操作系统 (Thunder) 工作时遇到问题。我编译start.o

nasm -f aout start.o start.asm

当我将引导加载程序和内核链接在一起时,它给了我这个错误:

start.o: 无法识别文件:无法识别文件格式。

关于我为什么会收到此错误以及如何解决它的任何建议?

【问题讨论】:

  • 您需要向我们展示代码,以及如何链接文件。你在哪个平台?如果file 命令可用,很想知道file start.o 返回什么。
  • @CoryKramer。这被标记为另一个问题的重复,但这两件事不相关。这可能是一个糟糕的问题,但它不是 What is an undefined reference/unresolved external symbol error and how to fix it? 的重复。这个问题实际上是关于为什么链接器不喜欢目标文件格式。这不是关于找不到的符号,而是关于由于文件格式无法识别而无法处理的目标文件。
  • Michael,它输出它是一个Linux i686文件。
  • 您能否复制并粘贴file start.o 的确切输出(我假设您的系统有程序file)。同样,您是在 Windows 上吗? (如果在 Windows 上,您使用的是 Cygwin 还是 MinGW?)或者您使用的是 Linux 或 OS/X 还是其他?
  • 您最初将此问题标记为 c++。鉴于错误似乎来自 GNU C/C++ 工具链 (LD),我想知道。你编译start.o 是否使用与此类似的命令(可能有其他选项和不同的文件名):g++ -c start.cpp somefile.h -o start.o。如果您使用 G++ 编译(使用 -c)并在命令行上指定头文件并指定输出文件(-o 选项),那么 G++ 将创建一个预编译的头文件并将其放在start.o 中。这些不能联系起来。如果你有头文件作为 G++ 编译行的一部分 - 删除它们。

标签: windows x86 cygwin nasm ld


【解决方案1】:

您收到的错误表明 LD 不理解 start.o 的文件格式,无法将其作为目标文件处理。当我在你的对象上运行 file start.o 时,它给了我这个输出:

start.o:Linux/i386 不纯的可执行文件 (OMAGIC)

您在 Windows 上使用 Cygwin。你说你用这条线把start.asm组装成start.o

nasm -f aout start.o start.asm

Cygwin 链接器 (LD) 无法将 aout 格式理解为有效的目标文件格式。您可以做的是让 NASM 使用 -fwin32 参数输出 Microsoft Win32 (i386) 对象文件。 LD 应该能够在链接阶段使用该目标文件格式。

【讨论】:

  • 这应该是答案nasm -f aout -o start.o start.asm -fwin32 顺便说一句,我正在使用 Windows linux 子系统 (WSL)。然后我在使用ld 时收到此错误i386 architecture of input file start.o is incompatible with i386:x86-64 output,这里的解决方案stackoverflow.com/questions/19200333/…
猜你喜欢
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2022-01-14
相关资源
最近更新 更多