我正试图从中编译一个样本
Multiboot 2 specification
在…上
马科斯
使用
LLVM
但我一开始就失败了。我想从中创建一个对象文件
靴子s
包括在内
多引导2。H
所以我打电话
gcc -m32 boot.S
但它因错误而崩溃:
boot.S:57:15: error: expected relocatable expression
.long -(0xe85250d6 + GRUB_MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))
下面是
靴子s
代码:
#define ASM_FILE 1
#include "multiboot2.h"
#ifdef HAVE_ASM_USCORE
# define EXT_C(sym) _ ## sym
#else
# define EXT_C(sym) sym
#endif
#define STACK_SIZE 0x4000
#ifdef __ELF__
# define AOUT_KLUDGE 0
#else
# define AOUT_KLUDGE MULTIBOOT_AOUT_KLUDGE
#endif
.text
.globl start, _start
start:
_start:
jmp multiboot_entry
.align 8
multiboot_header:
.long MULTIBOOT2_HEADER_MAGIC
.long GRUB_MULTIBOOT_ARCHITECTURE_I386
.long multiboot_header_end - multiboot_header
.long -(MULTIBOOT2_HEADER_MAGIC + GRUB_MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))
#ifndef __ELF__
address_tag_start:
.short MULTIBOOT_HEADER_TAG_ADDRESS
.short MULTIBOOT_HEADER_TAG_OPTIONAL
.long address_tag_end - address_tag_start
.long multiboot_header
.long _start
.long _edata
.long _end
address_tag_end:
entry_address_tag_start:
.short MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS
.short MULTIBOOT_HEADER_TAG_OPTIONAL
.long entry_address_tag_end - entry_address_tag_start
.long multiboot_entry
entry_address_tag_end:
#endif /* __ELF__ */
framebuffer_tag_start:
.short MULTIBOOT_HEADER_TAG_FRAMEBUFFER
.short MULTIBOOT_HEADER_TAG_OPTIONAL
.long framebuffer_tag_end - framebuffer_tag_start
.long 1024
.long 768
.long 32
framebuffer_tag_end:
.short MULTIBOOT_HEADER_TAG_END
.short 0
.long 8
multiboot_header_end:
multiboot_entry:
movl $(stack + STACK_SIZE), %esp
pushl $0
popf
pushl %ebx
pushl %eax
call EXT_C(cmain)
pushl $halt_message
call EXT_C(printf)
loop: hlt
jmp loop
halt_message:
.asciz "Halted."
.comm stack, STACK_SIZE
有人知道这个错误是什么意思吗?如何解决?
附笔。
我是个汇编高手。我只是想了解multiboot 2在内部的工作原理。