链接器脚本未正确设置原点

时间:2014-08-12 03:35:03

标签: c++ assembly linker x86 osdev

我一直在努力将我的C ++内核链接到我的x86 Assembly Stage2并且链接没有任何错误,但问题是当我在虚拟机上启动我的操作系统时,它会跳到Stage2,这导致我在我尝试将C ++内核链接到我使用的汇编代码之前,我认为链接器脚本出了问题:

org 0x200

并且它有效但是在链接时你需要一个elf可执行文件和elf格式不允许使用org指令所以我现在用于链接器:

global _Start:
_Start: 

我知道它确实找到了它只需要具有正确地址的文件这是链接器脚本:

KernAddr = 0x200;
ENTRY(_Start)
SECTIONS
{
    . = KernAddr;

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

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

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

   .bss : AT(ADDR(.bss) - KernAddr)
   {
       _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)
   }
}

这是我用来汇编,编译,链接和格式化我的操作系统的批处理程序:

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 Anmu.bin Stage2.o kernel.o -nostdlib
copy Stage1.bin Root
copy Anmu.bin Root
mkisofs -b Stage1.bin -no-emul-boot -boot-info-table -o BootLoader.iso ./Root

这就是x86_64-elf-g ++ -v输出:

Using built-in specs.
COLLECT_GCC=x86_64-elf-g++
COLLECT_LTO_WRAPPER=/home/Anonymous/opt/cross/libexec/gcc/x86_64-elf/4.8.3/lto-wrapper
Target: x86_64-elf
Configured with: ./configure --target=x86_64-elf --prefix=/home/Anonymous/opt/cross --host=x86_64-pc-cygwin --build=x86_64-pc-cygwin --disable-nls --enable-languages=c,c++ --without-headers
Thread model: single
gcc version 4.8.3 (GCC)

x86_64-elf-ld -v的输出:

GNU ld (GNU Binutils) 2.24

如果您需要查看它,还有完整的源代码: https://github.com/AnonymousUser1337/Anmu

1 个答案:

答案 0 :(得分:0)

好吧所以我发现我给出了错误的文件长度所以当它试图跳转到文件时它跳转到错误的地址导致它不加载引导程序的下一个阶段

相关问题