Bład w linkerze ld


(fedora24x) #1

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ć?

 


(kostek135) #2

Sprawdź, czy nie używasz kompilatorów  nasm i gcc o różnych docelowych architekturach (np i686 vs amd64). Poza tym sprawdź jeszcze sprawdzić czy jest ona zgodna z architekturą binutils.


(fedora24x) #3

pomogło, były to róznice w architekturze "modułów" systemu.


(kostek135) #4

Popraw swoją umiejętność Googlowania, bo daleko nie zajdziesz: http://wiki.osdev.org/GDT_Tutorial#What_should_i_put_in_my_GDT.3F


(fedora24x) #5

Umiejętność goglowania mam, ale przez wiekszość czasu pracuje offline,

więc nie zawsze mam jak googlowac :-/ Dziekuje, za link.

Jeszcze szukam czegoś do zarządzania pamiecią RAM.


(kostek135) #6

Marna wymówka. Zamiast pisać poprzedni post, mogłeś poszukać. Chyba, że posty piszesz offline...

 

Poszukaj w google ze słowami: management, memory i operation system.