首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:“.section”指令.section .multiboot中的意外标记

错误:“.section”指令.section .multiboot中的意外标记
EN

Stack Overflow用户
提问于 2020-01-18 10:34:40
回答 1查看 852关注 0票数 2

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

代码语言:javascript
复制
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 

以下是加载程序代码:

代码语言:javascript
复制
.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部分是什么,也不知道如何修复这个错误。我在谷歌上找不到关于.multiboot的信息。

P.S.如果我用MacOS很重要的话。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-29 02:04:43

如果这很重要,我用MacOS。

这就是其中的一部分。想必您的as实际上是针对主机的默认Apple (LLVM)汇编程序(check as --version)。这段代码是用https://wiki.osdev.org/Bare_Bones#Building_a_Cross-Compiler编写的。该代码假设您是在一个i 686-精灵交叉编译器下运行的。我认为LLVM和GCC汇编程序是可互换的,但是指令取决于您的输出目标。对于您来说,默认情况下,OSX上的as/clang/whatever假设您正在为您的主机进行编译,我认为它不使用ELF输出目标。通过-target i686-elf应该可以做到这一点。

尽管如此,如果您正在推进更丰富的OS/内核开发,那么就需要好理由来构建一个真正的交叉编译器。将一堆标志传递给您的主机编译器,以迫使它进行交叉编译,可能会使您陷入困境。

编辑:我发现了你的问题,因为我试图在我的Macbook上设置一个OS环境。如果您正在构建一个多引导内核,那么您最终将需要将上面的代码片段与真正的内核连接起来,可能需要使用链接器脚本。不幸的是,我刚刚发现苹果的ld不接受GCC风格的链接器脚本(来自LLVM的真正的ld,所以这是苹果的特性),所以我放弃了,只想在我的机器上构建GCC。我推荐那条路!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59799671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档