代码之家  ›  专栏  ›  技术社区  ›  Denis Steinman

期望可重定位表达式

  •  0
  • Denis Steinman  · 技术社区  · 5 年前

    我正试图从中编译一个样本 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 代码:

    /*  boot.S - bootstrap the kernel */
    /*  Copyright (C) 1999, 2001, 2010  Free Software Foundation, Inc.
     *
     * This program is free software: you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     */
    
    #define ASM_FILE        1
    #include "multiboot2.h"
    
    /*  C symbol format. HAVE_ASM_USCORE is defined by configure. */
    #ifdef HAVE_ASM_USCORE
    # define EXT_C(sym)                     _ ## sym
    #else
    # define EXT_C(sym)                     sym
    #endif
    
    /*  The size of our stack (16KB). */
    #define STACK_SIZE                      0x4000
    
    /*  The flags for the Multiboot header. */
    #ifdef __ELF__
    # define AOUT_KLUDGE 0
    #else
    # define AOUT_KLUDGE MULTIBOOT_AOUT_KLUDGE
    #endif
    
            .text
    
            .globl  start, _start
    start:
    _start:
            jmp     multiboot_entry
    
            /*  Align 64 bits boundary. */
            .align  8
    
            /*  Multiboot header. */
    multiboot_header:
            /*  magic */
            .long   MULTIBOOT2_HEADER_MAGIC
            /*  ISA: i386 */
            .long   GRUB_MULTIBOOT_ARCHITECTURE_I386
            /*  Header length. */
            .long   multiboot_header_end - multiboot_header
            /*  checksum */
            .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
            /*  header_addr */
            .long   multiboot_header
            /*  load_addr */
            .long   _start
            /*  load_end_addr */
            .long   _edata
            /*  bss_end_addr */
            .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
            /*  entry_addr */
            .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:
            /*  Initialize the stack pointer. */
            movl    $(stack + STACK_SIZE), %esp
    
            /*  Reset EFLAGS. */
            pushl   $0
            popf
    
            /*  Push the pointer to the Multiboot information structure. */
            pushl   %ebx
            /*  Push the magic value. */
            pushl   %eax
    
            /*  Now enter the C main function... */
            call    EXT_C(cmain)
    
            /*  Halt. */
            pushl   $halt_message
            call    EXT_C(printf)
    
    loop:   hlt
            jmp     loop
    
    halt_message:
            .asciz  "Halted."
    
            /*  Our stack area. */
            .comm   stack, STACK_SIZE
    

    有人知道这个错误是什么意思吗?如何解决?

    附笔。 我是个汇编高手。我只是想了解multiboot 2在内部的工作原理。

    0 回复  |  直到 5 年前
    推荐文章