Witam, robie jak w tym poradniku:
http://pl.wikibooks.org/wiki/Pisanie_OS/From_zero_to_hero
Man trzy pliki:
kernel.ld
OUTPUT_FORMAT("binary")
ENTRY("_start")
SECTIONS {
.text 0x100000 : {
code = . ; _code = . ;
*(.text)
}
.data : {
*(.data)
}
.bss : {
bss = . ; _bss = . ;
*(.bss)
*(.COMMON)
}
end = . ; _end = . ;
}
start.asm
[BITS 32]
[SECTION .text]
EXTERN code,bss,end
mboot:
dd 0x1BADB002 ; Sygnatura
dd 0x10001 ; Flagi dla bootloadera
dd -(0x1BADB002+0x10001) ; suma kontrolna nagłówka
dd mboot ; Pozycja nagłówka w pliku
dd code
dd bss
dd end
dd _start
GLOBAL _start
_start:
cli
mov esp,kstack+4096
mov ax,0x10
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
lgdt [gdt_descr]
jmp .1
.1:
push dword 0
push dword 0
push dword 0
push dword L6
EXTERN _start_kernel
push dword _start_kernel
ret
L6:
jmp L6
[SECTION .bss]
kstack: resd 1024
[SECTION .data]
gdt_descr:
dw 256*8-1
dd _gdt
GLOBAL _gdt
_gdt:
dd 0,0
dd 0x0000FFFF,0x00CF9A00
dd 0x0000FFFF,0x00CF9200
dd 0,0
times 254 dd 0,0
oraz kernel.c
static char * video_fb=(char *)0xb8000;
void putc(char c)
{
*video_fb++=c;
video_fb++;
}
void puts(char * s)
{
for(;*s;) putc(*s++);
}
void start_kernel(void)
{
puts("Hello World !");
for(;;);
}
i je kompiluje:
nasm start.asm -f coff -o start.o
gcc kernel.c -O2 -fomit-frame-pointer -c -o kernel.o
no i mam start.o i kernel.o (narazie wszystko jest OK), ale tu już się sypie:
ld -Tkernel.ld -o kernel.bin start.o kernel.o
no i błąd:
start.o: file not recognized: File format not recognized
Jak mam to zlinkować?