链接64位内核

时间:2014-08-11 01:16:38

标签: c++ assembly osdev

大家好我一直在尝试将我的汇编代码链接到C ++文件,这样我就可以从汇编中删除我的函数kMain,当我将它与这个脚本链接时:

ENTRY(_Start)
SECTIONS
{
    . = 0x2000;

    .text : AT(ADDR(.text) - 0x2000)
    {
        _code = .;
        *(.text)
        *(.rodata*)
        . = ALIGN(4096);
    }

   .data : AT(ADDR(.data) - 0x2000)
   {
        _data = .;
        *(.data)
        . = ALIGN(4096);
   }

   .eh_frame : AT(ADDR(.eh_frame) - 0x2000)
   {
       _ehframe = .;
       *(.eh_frame)
        . = ALIGN(4096);
   }

   .bss : AT(ADDR(.bss) - 0x2000)
   {
       _bss = .;
       *(.bss)

       /*
        * You usually need to include generated COMMON symbols
        * under kernel BSS section or use gcc's -fno-common
        */

        *(COMMON)
       . = ALIGN(4096);
   }

   _end = .;

   /DISCARD/ :
   {
        *(.comment)
   }
}

我收到警告说:x86_64-elf-ld:警告:找不到输入符号_Start;默认为0000000000002000 但是在我的汇编代码中,我从一开始就有这个:

[BITS 16] 
_Start: 

任何想法为什么它没有正确链接? 编辑:它现在有效宣布:

global _Start:
_Start:

但它不会在地址0x2000加载程序 我使用批处理程序来编译/汇编,格式化和链接我的操作系统:

nasm Stage1.asm -o Stage1.bin
nasm -f elf64 Stage2.asm -o Stage2.o
x86_64-elf-g++ -ffreestanding -mcmodel=large -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow -c -o kernel.o kernel.cpp
x86_64-elf-ld -T linkerscript.ld -o MyOS.bin Stage2.o kernel.o -nostdlib
copy Stage1.bin Root
copy MyOS.bin Root
mkisofs -b Stage1.bin -no-emul-boot -boot-info-table -o BootLoader.iso ./Root

如果您不想查看所有源代码,请访问: https://github.com/AnonymousUser1337/Anmu

1 个答案:

答案 0 :(得分:0)

您可能必须使用某种汇编程序指令(例如global)将_Start标签声明为全局。