i386输入文件的体系结构与i386:x86-64不兼容。

66

我正在尝试使用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

2
尝试回答这个问题可能会对你有帮助! - Shangbin Dong
5个回答

88

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

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

9
这就是解决方案。在x86_64上编译/链接32位应用程序时,将仿真设置为“elf_i386”可提供正确的elf格式。因此,例如,如果您使用“nasm -f elf file.asm -o file.o”编译汇编器应用程序,则链接命令是“ld -m elf_i386 -o exename file.o”。 - David C. Rankin
4
请不要忘记将“-o file.o file”替换为“-o file file.o”。 - Ruslan
如果这确实有效,将其设置为解决方案会很好。 - Balázs Börcsök

53

使用64位代替32位作为您的加载器,并使用以下命令进行编译:

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

这应该能解决你的错误


7

在x86_64上编译/链接32位应用程序时,将仿真设置为elf_i386可以提供正确的elf格式。例如,如果您使用nasm -f elf file.asm -o file.o编译汇编器应用程序,则链接命令是ld -m elf_i386 -o exename file.o。 致谢:David


2

我也遇到了同样的问题,我发现我的64位电脑使用32位寄存器(eax、ecx、edx、ebx、esp、ebp、esi、edi)而不是64位寄存器(rax、rcx、rdx、rbx、rsp、rbp、rsi、rdi)。然后使用以下命令来编译我的程序-

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

32位寄存器在64位模式下仍然存在,但是你不能只是将32位汇编程序编译为64位而不重写它。迁移到64位还可能需要调整数据结构的大小,因为指针变为两倍大。 - fcdt
没错,你说得对。但是当我们想要编写0x86-64(64位)汇编程序时,我们必须使用64位寄存器。基本上遇到了同样的问题,并通过这些指令找到了解决方案。如果我有错请纠正。 - Shanu Verma

1

在Windows系统上,我遇到了以下问题

ld: 输入文件 `file.o' 的i386架构与i386:x86-64输出不兼容

ld -m i386pe -s -o file.exe file.o ,对我有效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接