Autor Thema: C Kernel, ld : Unrrecognized File format  (Gelesen 18920 mal)

berlinermauer

  • Beiträge: 37
    • Profil anzeigen
Gespeichert
« am: 04. May 2009, 08:24 »
hi, ich habe gcc und ld für windows (minGSW),

so nun kommt bei folgendem aufruf :

ld -T link.txt -o c32kernel.bin

File not recognized : file format not recognized.
Dabei ist das einfach ein obj file


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 = .;
}

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 04. May 2009, 12:39 »
File not recognized : file format not recognized.
Dabei ist das einfach ein obj file
Was für ein Object-Format haben die denn? A.OUT, ELF oder COFF(oder so ähnlich)?

Du musst ein obj-Format verwenden, dass dein Linker unterstützt. Was dein linker unterstützt kannst du dir mit:
$ objdump -ianzeigen lassen.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

matheguru

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 04. May 2009, 14:41 »
Also die Beispiele in den Magazinen nutzen das ELF-Binärsystem, allerdings benutzt dein gcc für Windows wahrscheinlich das PE-Format der Standart von Windowsprogrammen. Ich hatte auch die Probleme mit meinem MinGW: glöst habe ich es so, dass ich mit dem Programm objcopy, müsste auch bei dir dabei sein, die pe-datei in elf umgewandelt habe. Die Parameter habe ich nicht im Kopf also gib mal objcopy /? ein, allerdings muss die Pathvariable richtig gesetzt sein!
« Letzte Änderung: 04. May 2009, 21:07 von matheguru »
Hacker zu sein bedeutet mehr, als sich nur damit auseinander zu setzen, es ist eine Lebenseinstellung

berlinermauer

  • Beiträge: 37
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 04. May 2009, 19:46 »
ok aber objcopy gibt mir mehr aus wie ich inner cmd sehen kann, und

laut dem hier : http://linux.about.com/library/cmd/blcmdl1_objcopy.htm

müsste

objcopy -o elf32-i386 kernel32.obj

funktionieren, aber er zeigt mir immer die help an

BTW objcopy pfad ist richt bzw ich mach immer cd...

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #4 am: 04. May 2009, 19:49 »
Dann steht ganz oben (vor der Hilfe) sicherlich was objcopy nicht passt.
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

matheguru

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 04. May 2009, 19:56 »
erstes Problem: klick mal mit nem rechts-klick auf die Titelleiste des CMD Interpreten. Dann musst du glaube ich auf eigenschaften und dort kannzt du dann größe des Puffers einstellen, schon kannst du die komplette help sehen, oder noch einfacher objcopy /? > help.txt schon hast du eine datei in dem verzeichniss mit dem inhalt der ausgabe. zweites Problem: du sagst in im Moment nur welche Datei du als Eingabe haben möchtest und die Ausgabedatei elf32-i386 haben soll aber wo geht die Ausgabe hin? Du kannst das eingeben objcopy -o elf32-i386 kernel32.obj kernel32.obj, dann müsste es gehen, er schreibt die Ausgabe gleich wieder in die Datei rein. Da gibt es noch nen praktisches Tool, dass du dabei haben müsstest, heist glaube ich readelf oder so? kuck einfach mal in dem verzeichniss von objcopy, nach einer vergleichbaren Datei. Hoffe ich konnte helfen, wenn dus geschaft hast noch mal posten! :wink:
« Letzte Änderung: 04. May 2009, 21:06 von matheguru »
Hacker zu sein bedeutet mehr, als sich nur damit auseinander zu setzen, es ist eine Lebenseinstellung

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #6 am: 04. May 2009, 20:07 »
readelf? Oder auch objdump...
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

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 04. May 2009, 20:52 »
Also die Beispiele in den Magazinen nutzen das ELF-Dateisystem
Binärformat, nicht Dateisystem.

Zitat
Ich hatte auch die Probleme mit meinem MinGW: glöst habe ich es so, dass ich mit dem Programm objcopy, müsste auch bei dir dabei sein, die pe-datei in elf umgewandelt habe.
Das ist bestenfalls Gebastel. Die saubere Lösung ist, einen Crosscompiler zu verwenden.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

matheguru

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 04. May 2009, 21:09 »
Man braucht sich nicht mühselig einen Crosscompiler zusammenbasteln oder sich einen Downloaden, natürlich geht das auch ganz prima, aber ich hatte es hallt so gelöst und es funktioniert auch prima.
Hacker zu sein bedeutet mehr, als sich nur damit auseinander zu setzen, es ist eine Lebenseinstellung

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #9 am: 04. May 2009, 21:22 »
Ich kann irgendwie nicht glauben, dass der normale objcopy unter Windows ELF kann... Zumindest kann meiner unter Linux kein PE.
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

matheguru

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 04. May 2009, 21:26 »
ist aber tatsache, jedenfalls unter MinGW gcc kann hier nur PE dann umwandeln mit objcoopy zu ELF und auch mit NASM den anderen Teil zum ELF-binärformat übersetzen und dann meckert auch ld nicht mehr über verschiedene oder nicht lesbare Binärformate. Funktioniert hier wunderbar bei mir.
Hacker zu sein bedeutet mehr, als sich nur damit auseinander zu setzen, es ist eine Lebenseinstellung

berlinermauer

  • Beiträge: 37
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 04. May 2009, 21:34 »
Also, naja es lag daran dass ich -o statt -O geschrieben hatte,

jetzt meint er aber ebf. unrecognized Format?!!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 04. May 2009, 21:35 »
Ich kann irgendwie nicht glauben, dass der normale objcopy unter Windows ELF kann... Zumindest kann meiner unter Linux kein PE.
Doch, ich meine mich auch zu erinnern, daß er das kann. So wurde das ganz am Anfang mit LOST gemacht, glaube ich.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

matheguru

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 05. May 2009, 15:03 »
Dann versuche es mal, indem du mit NASM deinen Kernel auch mahl in andere Formate zu assemblieren, vieleicht benutzt dein gcc ja noch nen anderes Format. Möglichkeiten elf, aout, pe, coff oder gib einfach mal nasm -fh für die Liste ein und probiere es mal mit jedem Format.
Hacker zu sein bedeutet mehr, als sich nur damit auseinander zu setzen, es ist eine Lebenseinstellung

berlinermauer

  • Beiträge: 37
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 05. May 2009, 16:25 »
jetzt habe ich statt "aout", "elf" benutzt.

C:\gcc\bin\ld.exe: cannot perform PE operations on non PE output file 'c32kernel.bin'.
Das System kann die angegebene Datei nicht finden.
C:\gcc\bin\c32kernel.bin konnte nicht gefunden werden

matheguru

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 05. May 2009, 16:52 »
Was hasd du denn vorher eingegeben, bevor die Meldung kam? Ich will dich nicht beinflussen oder so und ich weis ja auch nicht warum du gerade minGSW genommen hast, aber ich würde dir zu MinGW raten, wurde auch schon für irg. ein größerses OS zur entwicklung verwendet.
Hacker zu sein bedeutet mehr, als sich nur damit auseinander zu setzen, es ist eine Lebenseinstellung

berlinermauer

  • Beiträge: 37
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 05. May 2009, 21:58 »
hier der ganze code, die copys und dels kannste ignorieren :

@echo off
nasm -f bin -o kernel16.bin kernel16.asm
REM nasm -f aout -o kernel32.obj kernel32.asm
nasm -f elf -o kernel32.obj kernel32.asm

copy kernel.c C:\gcc\bin\kernel.c
copy link.txt C:\gcc\bin\link.txt
copy kernel32.obj C:\gcc\bin\kernel32.obj

pause
C:\gcc\bin\gcc.exe -ffreestanding -c -Os -o ckernel.obj kernel.c
C:\gcc\bin\ld.exe -T link.txt -o c32kernel.bin

copy C:\gcc\bin\c32kernel.bin c32kernel.bin

del /f /q C:\gcc\bin\kernel.c
del /f /q C:\gcc\bin\link.txt
del /f /q C:\gcc\bin\kernel32.obj
del /f /q C:\gcc\bin\c32kernel.bin

copy kernel16.bin+c32kernel.bin kernel.bin
pause


berlinermauer

  • Beiträge: 37
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 08. May 2009, 23:01 »
kann mir denn keiner helfen?

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 08. May 2009, 23:27 »
du brauchst nen cross compiler
bzw einen compiler und einen liker die beide elf ferstehen
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 09. May 2009, 09:11 »
Und dazu haben wir einen Artikel: http://lowlevel.brainsware.org/wiki/index.php/Crosscompiler_für_Windows

Der sogar im "OS-Dev für Einsteiger" verlinkt ist, aber das scheint ja keiner zu lesen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen