大家好我一直在尝试将我的汇编代码链接到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:警告:找不到输入符号_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 :(得分:0)
您可能必须使用某种汇编程序指令(例如global
)将_Start标签声明为全局。