error: unexpected token in '.section' directive .section .multiboot

error: unexpected token in '.section' directive .section .multiboot

我找到了一个简单内核加载程序的示例,并尝试了解它的工作原理。但由于错误,我什至无法构建它:

loader.s:5:20: error: unexpected token in '.section' directive
.section .multiboot
                   ^
loader.s:11:15: error: unexpected token in '.section' directive
.section .text
              ^
loader.s:28:1: error: unknown directive
.sectio .bss 

加载器代码如下:

.set MAGIC, 0x1badb002
.set FLAGS, (1<<0 | 1<<1)
.set CHECKSUM, -(MAGIC + FLAGS)

.section .multiboot
    .long MAGIC
    .long FLAGS
    .long CHECKSUM


.section .text
.extern main
.extern callConstructors
.global loader

loader:
    mov $kernel_stack, %esp
    call callConstructors
    push %eax
    push %ebx
    call main

_stop:
    cli
    hlt
    jmp _stop

.sectio .bss 
.space 2*1024*1024;
kernel_stack:

我编译成as -m32 loader.s.

搜索后我发现我不需要将 .section.text.bss 一起使用,但我不知道什么是 .multiboot 部分以及如何使用修复此错误。我在 Google.

中找不到有关 .multiboot 的信息

P.S. 如果重要我用 MacOS.

P.S. If it's important I use MacOS.

这是其中的一部分。据推测,您的 as 实际上是针对您的主机的默认 Apple Clang (LLVM) 汇编程序(检查 as --version)。此代码是用 GCC cross-compiler 构建的。该代码假设您在 i686-elf 交叉编译器下 运行。我认为 LLVM 和 GCC 汇编程序可以互换,但指令取决于您的输出目标。对于您来说,as/clang/OSX 上的任何内容默认情况下假定您正在为您的主机编译,我认为它不使用 ELF 输出目标。通过 -target i686-elf 就可以了。

就是说,如果您正在推进更丰富的 OS/kernel 开发,good reason 可以为您自己打造一个真正的交叉编译器。将一堆标志传递给你的主机编译器以强制它进行交叉编译可能会让你在路上遇到一些痛苦。

编辑:我遇到了你的问题,因为我正试图在我的 Macbook 上设置一个 OS 开发环境。如果你正在构建一个多重引导内核,你最终将需要 link 上面的片段与真正的内核,可能使用 linker 脚本。不幸的是,我刚刚发现 Apple 的 ld 不接受 GCC 风格的 linker 脚本(真正的 ld 来自 LLVM,所以这是 Apple 的特质),所以我给并在我的机器上构建 GCC。我会推荐那条路线!