Autor Thema: ld unbekanntes Fileformat  (Gelesen 6071 mal)

fr0z3n

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« 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:
Zitat
start.o: file not recognized: File format not recognized
Diese Datei entsteht folgendermaßen:
Zitat
nasm -f aout -o start.o start.asm
Der ld Befehl lautet:
Zitat
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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 15. May 2008, 18:00 »
Versuch mal:
Zitat
nasm -f elf64 -o start.o start.asm
Wobei das erst ab der nasm version 2 geht.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

fr0z3n

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 15. May 2008, 18:54 »
Dann erhalte ich folgendes:
Zitat
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:
Zitat
global start
start:
    mov esp, _sys_stack     ; This points the stack to our new stack area
    jmp stublet

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 15. May 2008, 18:58 »
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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

fr0z3n

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 15. May 2008, 23:33 »
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:
Zitat
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:
Zitat
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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 16. May 2008, 06:32 »
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, 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. Da werden dann die Symbole __kernel_start__, __ctors_start__, __ctors_end__ und __kernel_end__ von ld bereitgestellt.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

fr0z3n

  • Beiträge: 15
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 16. May 2008, 14:22 »
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?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 16. May 2008, 15:01 »
An Tutorials wäre mir da nichts bekannt, aber ich nehme einfach mal an, dass die ld Dokumentation nicht schlecht ist, hab aber da selbst noch nie was nachgeschlagen.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

 

Einloggen