Autor Thema: GRUB, Linking  (Gelesen 3714 mal)

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« am: 28. December 2005, 13:21 »
Ich habe Probleme mit dem Linken eines GRUB-konformen Kernels. Ich hatte diese Linkerfiles noch nie im Griff:

Link.txt
OUTPUT_FORMAT("binary")
INPUT(start1.o start2.o)
SECTIONS
{
  . = 0x100000;
  .text : { *(.text) }
  .data  : { *(.data) }
  .bss  : { *(.bss) }
}


Ich weiss, da fehlt noch viel.

start.asm
CPU 386
BITS 32

EXTERN _start
GLOBAL Start

MULTIBOOT_PAGE_ALIGN   equ 1<<0
MULTIBOOT_MEMORY_INFO  equ 1<<1
MULTIBOOT_AOUT_KLUDGE  equ 1<<16

MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
CHECKSUM               equ -(0x1BADB002 + MULTIBOOT_HEADER_FLAGS)

ALIGN 4

MultibootHeader:
DD 0x1BADB002
DD MULTIBOOT_HEADER_FLAGS
DD CHECKSUM
DD MultibootHeader
DD 0x00100000
DD 0x00200000
DD 0x00200000
DD Start

Start:
  CALL _start
  JMP $


GRUB akzeptiert das nicht. Ich müsste noch irgendetwas bei der Data-Section ändern, weiss aber nicht was.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 28. December 2005, 13:24 »
Link deinen Kernel einfach zu einer ELF Datei, dann kannst du dir die Addressen und Offsets im Multibootheader sparen, und brauchst nur Magic, Flags und Checksum.

elfish_rider

  • Beiträge: 293
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 28. December 2005, 13:25 »
Mein Linker unterstützt ELF nicht. :(

Edit:

Es ist jetzt gegangen, ich musste nur die Grösse der Daten im Multiboot-Header ändern. Ich weiss aber nicht, wie ich das eintragen soll, ich weiss ja erst nach dem Kompilieren, wie gross die BIN wird...

Edit:

Ich habe jetzt eifach am Schluss eine ASM dazugelinkt, die nur ein Symbol hat. Dessen Adresse wird dann eingetragen. Total unelegant. Sorry für den blöden Thread, ich hasse diese Linkerfiles eifach...;)

Edit:

Wieso funktioniert das nicht?  :(

link.txt
OUTPUT_FORMAT("binary")
SECTIONS
{
  . = 0x100000;
  .text : { *(.text) }
  .data  : { *(.data) }
  .bss  : { *(.bss) }
  Ending = SIZEOF(.text+.data);
}
INPUT(start1.o start2.o text.o)


.asm (Auszug)
DD Ending

ena

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 27. January 2006, 17:08 »
Kann mir jmd. vielleicht nen link zu nem tutorial geben wo beschrieben wird wie man einen grub kompatiblen kernel schreibt?

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 28. January 2006, 08:54 »
db 0x55AA

 

Einloggen