制作一个玩具 unix os:ld 的问题

制作一个玩具 unix os:ld 的问题

所以我正在关注这个教程推出你自己的 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
$

解决了问题。

相关内容