【问题标题】:Architecture of i386 input file is incompatible with i386:x86-64i386 输入文件的架构与 i386:x86-64 不兼容
【发布时间】:2013-10-12 13:55:06
【问题描述】:

我正在尝试使用 Ubuntu 创建一个简单的内核。在我输入的终端中

ld -Ttext 0x1000 -o kernel.bin loader.o main.o Video.o

但我收到以下错误消息:

ld: i386 architecture of input file `loader.o' is incompatible with i386:x86-64 output
ld: warning: cannot find entry symbol _start; defaulting to 0000000000001000

【问题讨论】:

标签: linux ld i386


【解决方案1】:

我也遇到了同样的问题,我发现我是 32 位寄存器(eax,ecx,edx,ebx,esp,ebp,esi,edi)坚持使用 64 位寄存器(rax,rcx,rdx,rbx, rsp,rbp,rsi,rdi),在我的 64 位计算机中。 然后使用这些命令编译我的程序-

nasm -felf64 hello.asm
ld hello.o
./a.out

【讨论】:

  • 32 位寄存器在 64 位模式下仍然存在,但你不能不重写就将 32 位汇编程序编译为 64 位。移植到 64 位也可能需要调整数据结构的大小,因为指针会变成原来的两倍。
  • 没错,你是对的。但是当我们要编写代码0x86-64(64位)汇编程序时,我们必须使用64位寄存器。基本上遇到了同样的问题并使用这些得到了解决方案指令。如果错了就更正
【解决方案2】:

如果要将文件编译为 32 位,可以使用:

ld -m elf_i386 -s -o file file.o

【讨论】:

  • 这就是解决方案。在 x86_64 上编译/链接 32 位应用程序时,将仿真设置为 elf_i386 可提供正确的 elf 格式。因此,例如,如果您使用nasm -f elf file.asm -o file.o 编译一个汇编程序应用程序,则链接命令为ld -m elf_i386 -o exename file.o
  • 别忘了用-o file file.o替换-o file.o file
  • 如果它确实有效,将其设置为解决方案会很棒。
【解决方案3】:

在 x86_64 上编译/链接 32 位应用程序时,将模拟设置为 elf_i386 可提供正确的 elf 格式。因此,例如,如果您使用nasm -f elf file.asm -o file.o 编译一个汇编程序应用程序,则链接命令为ld -m elf_i386 -o exename file.o 礼貌:大卫

【讨论】:

    【解决方案4】:

    为您的加载程序使用 64 位而不是 32 位,并使用以下命令对其进行编译:

    nasm -f elf64 loader.asm -o loader.o
    

    这应该可以解决您的错误

    【讨论】:

      猜你喜欢
      • 2019-01-18
      • 2020-06-18
      • 2011-10-25
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 2020-12-12
      相关资源
      最近更新 更多