Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: fr0z3n am 15. May 2008, 17:50
-
Hi!
Ich versuche mich gerade an 64-bit. Habe mir dazu einen x86_64 ELF Cross-Compiler gebaut (Mac OS X, deswegen Cross-Compiler).
Mein Problem ist jetzt allerdings, wenn ich einen kleinen Tutorialkernel damit linken will, beschwert sich ld:start.o: file not recognized: File format not recognized
Diese Datei entsteht folgendermaßen: nasm -f aout -o start.o start.asm
Der ld Befehl lautet: ld -f elf64-x86-64 -o kernel.bin start.o main.o
Ich habe keine Ahnung was ihn jetzt stört, weil das ganze mit einem 32-bit ELF Cross-Compiler ohne Murren funktionierte. Weißt jemand von euch Rat?
schonmal danke
fr0z3n
-
Versuch mal:
nasm -f elf64 -o start.o start.asm
Wobei das erst ab der nasm version 2 geht.
-
Dann erhalte ich folgendes:
warning: cannot find entry symbol _start; defaulting to 00000000004000b0
start.o: In function `mboot':
start.asm:(.text+0x1c): undefined reference to `code'
start.asm:(.text+0x20): undefined reference to `bss'
Der Teil über den sich ld beschwert ist wohl dieser: global start
start:
mov esp, _sys_stack ; This points the stack to our new stack area
jmp stublet
-
Naja, zwischen start und _start ist halt schon ein Unterschied, meinst du nicht :wink:
Wenn du elf als Dateiformat nimmst, dann brauchst du nicht den a.out kludge in der Multibootheader, insofern gehen dann auch die undefinierten Referenzen weg, fallls ich das jetzt alles richtig interpretiert habe.
-
Okay die Meldung wegen des _start Symbols ist weg.
Verstehe zwar gerade nicht genau, wieso er _start mit Unterstrich haben will, aber vielleicht kann mir das ja noch jemand erklären? :-)
Die Meldungen wegen des Code und BSS Parts sind allerdings immer noch da: start.asm:(.text+0x1c): undefined reference to `code'
start.asm:(.text+0x20): undefined reference to `bss'
Poste hier dafür am besten mal den gesamten Code der Datei, den ich aus einem Tutorial von osdever.net habe: global _start
_start:
mov esp, _sys_stack ; This points the stack to our new stack area
jmp stublet
; This part MUST be 4byte aligned, so we solve that issue using 'ALIGN 4'
ALIGN 4
mboot:
; Multiboot macros to make a few lines later more readable
MULTIBOOT_PAGE_ALIGN equ 1<<0
MULTIBOOT_MEMORY_INFO equ 1<<1
MULTIBOOT_AOUT_KLUDGE equ 1<<16
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
EXTERN code, bss, end
; This is the GRUB Multiboot header. A boot signature
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_CHECKSUM
; AOUT kludge - must be physical addresses. Make a note of these:
; The linker script fills in the data for these ones!
dd mboot
dd code
dd bss
dd end
dd _start
stublet:
extern main
call main
; Here is the definition of our BSS section. Right now, we'll use
; it just to store the stack. Remember that a stack actually grows
; downwards, so we declare the size of the data before declaring
; the identifier '_sys_stack'
SECTION .bss
resb 8192 ; This reserves 8KBytes of memory here
_sys_stack:
schonmal vielen vielen Dank für eure Hilfe
-
Verstehe zwar gerade nicht genau, wieso er _start mit Unterstrich haben will, aber vielleicht kann mir das ja noch jemand erklären? :-)
Implizites -fleading-underscore (http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Code-Gen-Options.html#Code-Gen-Options), wie z.B. unter Windows?
1. Brauchst du überhaupt den a.out kludge in der Multiboot Header?
edit: Wenn du z.B. sowieso ELF als Dateiformat wählen willst, dann brauchst du den Teil der Multiboot Header überhaupt nicht.
2. Wie sieht dein Linkerscript aus? Da sollten dann schon die Symbole mboot, code, bss und end definiert sein. Ld wird nicht automatisch für die Sections ein Symbol erzeugen. Siehe z.B. hier (https://lightos.bountysource.com/svn/!source/413/trunk/kernel/x86/kernel.ld). Da werden dann die Symbole __kernel_start__, __ctors_start__, __ctors_end__ und __kernel_end__ von ld bereitgestellt.
-
Achso okay jetzt verstehe ich auch den Sinn dieser Linkscripts ^^
Hat jemand dazu vielleicht mal ein Tutorial, dass diese Linkscript Sache mit diesen ganzen Ausgabeformaten mal erklärt, damit ich da mal den Durchblick bekomme?
-
An Tutorials wäre mir da nichts bekannt, aber ich nehme einfach mal an, dass die ld Dokumentation (http://sourceware.org/binutils/docs/ld/index.html) nicht schlecht ist, hab aber da selbst noch nie was nachgeschlagen.