我一直在研究我的内核项目并模拟它(即在QEMU上运行它),我需要它作为一个。iso文件。
我有一个汇编文件,并组装它-as --32 boot.s -o boot.o
和主代码(c++),编译它-gcc -S kernel.cpp -lstdc++ -o kernel.o
没有错误。但是,
与此链接器脚本链接:-
ENTRY(_start)
SECTIONS
{
/* we need 1MB of space atleast */
. = 1M;
/* text section */
.text BLOCK(4K) : ALIGN(4K)
{
*(.multiboot)
*(.text)
}
/* read only data section */
.rodata BLOCK(4K) : ALIGN(4K)
{
*(.rodata)
}
/* data section */
.data BLOCK(4K) : ALIGN(4K)
{
*(.data)
}
/* bss section */
.bss BLOCK(4K) : ALIGN(4K)
{
*(COMMON)
*(.bss)
}
}
(链接命令我使用的是ld -T linker.ld kernel.o boot.o -o OS.bin
)
说: -
ld:kernel.o: file format not recognized; treating as linker script
ld:kernel.o:1: syntax error
我做了一些错误的链接或组装引导。S或编译kernel.cpp?
gcc -S
生成汇编语言,但ld
需要一个目标文件。在两者之间的某个地方,你必须运行汇编程序。
没有特别需要使用汇编器输出,所以最有可能使用-c
,它先进行编译,然后进行汇编以生成目标文件,而不是-S
:
gcc -c kernel.cpp -o kernel.o
-lstdc++
是无用的,因为它只适用于链接,无论如何,你似乎不太可能成功地在内核中使用标准的c++库。