Сценарий компоновщика не устанавливает правильное происхождение

Я работал над подключением моего ядра C ++ к моей сборке x86 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

0

Решение

Итак, я понял, что указал неправильную длину файла, поэтому, когда он попытался перейти к файлу, он перешел на неправильный адрес, что привело к не загружать следующую стадию загрузчика

0

Другие решения


По вопросам рекламы [email protected]