Danke, genau das habe ich gesucht!
Ich habe nun ein weiteres Problem, wenn ich versuche, meinen Kernel (bzw. momentan nur den Startup-Code, den Rest muss ich erst noch portieren) zu kompilieren. Wenn ich das Ganze linke, bekomme ich folgende Fehlermeldung ausgespuckt:
-- Linking kernel executable
./boot/boot.o: In function `_start':
boot.asm:(.text+0x0): multiple definition of `start'
boot/boot.o:boot.asm:(.text+0x0): first defined here
./boot/boot.o: In function `_start':
boot.asm:(.text+0x0): multiple definition of `_start'
boot/boot.o:boot.asm:(.text+0x0): first defined here
./boot/boot.o: In function `start32':
boot.asm:(.text+0x2c): multiple definition of `start32'
boot/boot.o:boot.asm:(.text+0x2c): first defined here
./boot/boot.o: In function `multiboot_header':
boot.asm:(.text+0x18): relocation truncated to fit: R_X86_64_32 against `.text'
boot.asm:(.text+0x1c): relocation truncated to fit: R_X86_64_32 against `.text'
boot.asm:(.text+0x28): relocation truncated to fit: R_X86_64_32 against `.text'
./boot/boot.o: In function `start32':
boot.asm:(.text+0x38): relocation truncated to fit: R_X86_64_32 against `.text'
boot.asm:(.text+0x53): relocation truncated to fit: R_X86_64_32 against `.text'
./boot/boot.o: In function `code64Jump':
boot.asm:(.text+0x6e): relocation truncated to fit: R_X86_64_PC32 against symbol `start64' defined in .text section in ./boot/loader.o
./krnl/main.o:(.eh_frame+0x20): relocation truncated to fit: R_X86_64_32 against `.text'
make: *** [kernel] Error 1
Ich gehe stark davon aus, dass zumindest das erste Problem am Linkerscript liegt, aber da ich mich mit den ld-Skripten leider nicht sehr gut auskenne, weiß ich nicht, was daran falsch ist:
/*
* kernel.ld
*/
/* define kernel link locations */
kernel_VMA = 0xffff800000000000;
kernel_LMA = 0x100000;
ENTRY(_start)
/* define different sections */
SECTIONS
{
/* link from LMA */
. = kernel_LMA;
_boot = .;
_kernelLMA = .;
/* boot.asm is ran in linear addresses */
.text_boot :
{
boot/boot.o (.text)
}
_eboot = .;
/* link from VMA */
. = . + kernel_VMA;
_text = .;
_kernel = .;
_kernelVMA = kernel_VMA;
/* the rest of the code links to higher memory */
.text : AT(ADDR(.text) - kernel_VMA + kernel_LMA)
{
_code = .;
*(.text)
*(.text*)
*(EXCLUDE_FILE(*boot/boot.o) .text)
/* read only data */
*(.rodata*)
*(.rdata*)
. = ALIGN(4096);
}
/* _etext defined */
_etext = .; PROVIDE(etext = .);
_data = .;
/* data section */
.data : AT(ADDR(.data) - kernel_VMA + kernel_LMA)
{
data = .;
*(.data)
. = ALIGN(4096);
}
/* _edata defined */
_edata = .; PROVIDE(edata = .);
bss = .;
/* static code */
.bss : AT(ADDR(.bss) - kernel_VMA + kernel_LMA)
{
*(.bss)
. = ALIGN(4096);
}
_ebss = .;
.ehframe : AT(ADDR(.ehframe) - kernel_VMA + kernel_LMA)
{
ehframe = .;
*(.ehframe)
. = ALIGN(4096);
}
_end = .; PROVIDE (end = .);
_ekernel = .;
}
start, _start und start32 sind allesamt in der boot.asm definiert, die ich ja noch extra einbinde, aber eigentlich für den späteren Verlauf exclude.
Woran das "relocation truncated to fit R_X86_64_32 liegen könnte, weiß ich leider nicht.