Привет всем! Я пытался связать мой ассемблерный код с файлом 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
Вы, вероятно, должны объявить метку _Start как глобальную, используя некую директиву ассемблера (например, global
).