Я работал над подключением моего ядра 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
Итак, я понял, что указал неправильную длину файла, поэтому, когда он попытался перейти к файлу, он перешел на неправильный адрес, что привело к не загружать следующую стадию загрузчика