51

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

4 回答 4

68

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

ld -m elf_i386 -s -o file file.o
于 2014-06-17T00:49:21.277 回答
47

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

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

这应该可以解决您的错误

于 2014-01-02T10:57:24.807 回答
6

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

于 2015-02-18T07:18:18.823 回答
0

我也遇到了同样的问题,我发现我是 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
于 2020-08-26T17:33:22.617 回答