Связывание 64-битного ядра

Привет всем! Я пытался связать мой ассемблерный код с файлом 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: warning: не удается найти символ ввода _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

0

Решение

Вы, вероятно, должны объявить метку _Start как глобальную, используя некую директиву ассемблера (например, global).

0

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


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