Lowlevel
Lowlevel => Softwareentwicklung => Thema gestartet von: FlorianN 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:
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:
nasmw -f aout -o kernel32.obj kernel32.asm
Und linken:
ld -T link.txt -o c32kernel.bin
Danke,
Florian
-
Wahrscheinlich mag dein ld einfach kein a.out. Du solltest nasm mal sagen, dass er was anderes produzieren soll, womit dein Linker umgehen kann.
-
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.
-
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 (http://www.lowlevel.eu/wiki/Crosscompiler_für_Windows).
-
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
-
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:
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 = .;
}
-
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
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.