i386 输入文件的架构与 i386:x86-64 不兼容

Posted

技术标签:

【中文标题】i386 输入文件的架构与 i386:x86-64 不兼容【英文标题】:Architecture of i386 input file is incompatible with 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

【问题讨论】:

same question 也许会对你有所帮助! 【参考方案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

这应该可以解决您的错误

【讨论】:

以上是关于i386 输入文件的架构与 i386:x86-64 不兼容的主要内容,如果未能解决你的问题,请参考以下文章

is incompatible with i386:x86-64 output报错

iOS13 xcode11打包不支持模拟器架构i386 x86_64

GDB 错误:所选架构 i386 与报告的目标架构 i386 不兼容:x86-64

使用 gcc -m32 标志找不到 -lgcc 和 -lgcc_s

iOS 指令集arm64、armv7s、armv7、i386、x86_64

AMD64和i386的区别