所以我正在关注这个教程推出你自己的 Unix 玩具。
Makefile 看起来像这样:
SOURCES=boot.o main.o
CC=gcc
CFLAGS=-nostdlib -nostdinc -fno-builtin -fno-stack-protector
LDFLAGS=-Tlink.ld
ASFLAGS=-felf
all: $(SOURCES) link
clean:
-rm *.o kernel
link:
ld $(LDFLAGS) -o kernel $(SOURCES)
.s.o:
nasm $(ASFLAGS) $<
在 OSX 上我无法做到,make
因为苹果的ld不支持-T
切换。我尝试在 CentOS 上编译,得到以下结果:
[gideon@centosbox src]$ make
nasm -felf boot.s
cc -nostdlib -nostdinc -fno-builtin -fno-stack-protector -c -o main.o main.c
main.c:4: warning: 'struct multiboot' declared inside parameter list
main.c:4: warning: its scope is only this definition or declaration, which is probably not what you want
ld -Tlink.ld -o kernel boot.o main.o
boot.o: could not read symbols: File in wrong format
make: *** [link] Error 1
当然我唯一的问题是File in wrong format.
这是什么意思?我该如何纠正它?
答案1
这些听起来像是您正在混合不同架构的代码。看这里:无法读取符号,文件格式错误。
摘抄
当您更改架构时,您会收到该错误。这些 CHOST/CFLAGS 设置是新的吗?
问题
- 我想知道 Toy Unix OS 是否只能构建在 x86 而不能构建在 x64 上。有什么值得研究的。
make clean
。您在 CentOS 上使用的文件是否来自 OSX?- 我看到
boot.o
正在使用但没有看到它正在编译,除非nasm -felf boot.s
构建它,所以也许它是该文件的 OSX 版本。
修复
如果您查看选项,nasm
您会发现它使用了开关:
$ nasm -felf boot.s
格式elf
为32位格式。在较新的 64 位系统上,您需要将其更改为elf64
.您可以使用以下选项查看这些格式nasm -hf
:
$ nasm -hf
...
valid output formats for -f are (`*' denotes default):
* bin flat-form binary files (e.g. DOS .COM, .SYS)
ith Intel hex
srec Motorola S-records
aout Linux a.out object files
aoutb NetBSD/FreeBSD a.out object files
coff COFF (i386) object files (e.g. DJGPP for DOS)
elf32 ELF32 (i386) object files (e.g. Linux)
elf64 ELF64 (x86_64) object files (e.g. Linux)
as86 Linux as86 (bin86 version 0.3) object files
...
因此更改 Make 文件中的这一行:
ASFLAGS=-felf64
并重新运行make
:
$ make
ld -Tlink.ld -o kernel boot.o main.o
$
解决了问题。