Autor Thema: Linker-Problem  (Gelesen 9588 mal)

FlorianN

  • Beiträge: 50
    • Profil anzeigen
Gespeichert
« am: 20. July 2013, 10:10 »
Hallo Community,
ich bin kurz davor zu verzweifeln. Immer wenn ich versuche zu linken bekomme ich ein und die selbe meldung:

Zitat
kernel32.obj: file not recognized: File format not recognized

Ich habe viele Anleitungen probiert, ettliche Linkerscripts und Compilerbefehle für kernel32.obj aber nichts klappt, immer der selbe Fehler. Ich verwende NASM, GCC/MinGW und Windows 8.


Compilieren von kernel32:
Zitat
nasmw -f aout -o kernel32.obj kernel32.asm
Und linken:
Zitat
ld -T link.txt -o c32kernel.bin

Danke,
Florian
Woher ich das weiß? Keine Ahnung.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 20. July 2013, 10:12 »
Wahrscheinlich mag dein ld einfach kein a.out. Du solltest nasm mal sagen, dass er was anderes produzieren soll, womit dein Linker umgehen kann.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

FlorianN

  • Beiträge: 50
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 20. July 2013, 10:51 »
Hab jetzt ein paar durchprobiert, funktioniert aber immernoch nicht. Ein und das selbe Problem. Ich komm nicht dahinter. Hab versucht aout durch einige andere Parameter zu ersetzen, entweder hat NASM nichteinmal Kompeiliert, oder ich bekomme wieder die gleiche Meldung.
Woher ich das weiß? Keine Ahnung.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 20. July 2013, 12:12 »
Also die wesentliche fehlende Information wäre erst einmal, welches Format dein ld überhaupt braucht.

Wo hast du den Linker denn her? Wenn es der normale mingw-Linker ist, dann arbeitet er mit dem nativen Format von Windows, nämlich PE. Im Allgemeinen willst du stattdessen eher ELF benutzen. Dazu brauchst du unter Windows einen Crosscompiler.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

FlorianN

  • Beiträge: 50
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 20. July 2013, 12:27 »
Hab grad aufs Ubuntu gewechselt um es dort zu probieren, kein Erfolg, das gleiche. Ich werde den Crosscompiler mal probieren.



PS: Ganz normaler GCC auf Ubuntu
Woher ich das weiß? Keine Ahnung.

FlorianN

  • Beiträge: 50
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 20. July 2013, 13:40 »
Also, auf Windows geht der Crosscompiler garnicht, auf Ubuntu funktioniert er (ein und der selbe), aber ich bekomme immernoch diese Meldung.

Ausschnitt aus dem Terminal:
Zitat
wine i586-elf-ld.exe -T link.txt -o c32kernel.bin
kernel32.obj: file not recognized: File format not recognized

Und der Linkerskript
OUTPUT_FORMAT("binary")
INPUT(kernel32.obj ckernel.obj)
ENTRY(start)
SECTIONS
{
  .text  0x10200 : {
    code = .; _code = .; __code = .;
    *(.text)
    . = ALIGN(1);
  }
  .data  : {
    data = .; _data = .; __data = .;
    *(.data)
    . = ALIGN(1);
  }
  .bss  :
  {
    bss = .; _bss = .; __bss = .;
    *(.bss)
    . = ALIGN(1);
  }
  end = .; _end = .; __end = .;
}
Woher ich das weiß? Keine Ahnung.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 20. July 2013, 16:47 »
Du musst dich zwischen den verschiedenen Kombinationen von Compilern, Linkern und Aufrufparametern entscheiden. Mischen geht nicht:

  • Unter Windows mit MinGW (nicht empfohlen):
    • nasm(w) -f win32
    • gcc ...
    • ld ...
  • Unter Windows mit einem Cross-Compiler
    • nasm -f elf
    • i586-elf-gcc ...
    • i586-elf-ld ...
  • Unter Linux
    • nasm -f elf
    • gcc ...
    • ld ...

Mit wine da irgendwas zu versuchen bringt nichts. Du solltest dir unter Linux einfach nasm und gcc aus der Paketverwaltung installieren.

Wenn der Crosscompiler unter Windows nicht geht, dann wäre die Fehlermeldung hilfreich. Und wenn eins von den obigen Varianten nicht funktioniert, wären die genauen Aufrufe interessant.
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen