Autor Thema: [Solved]'Invalid or unsupported executable format' bei übergabe von Parametern  (Gelesen 3691 mal)

aMen

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
Da ich neu hier bin erstmal ein herzliches Hallo an alle, einge werden mich bereits aus dem IRC kennen.

Ich habe ein Problem was ich ehrlich gesagt überhauptnicht versteh.

Ich habe einen funktionierenden "Hallo-Welt-Kernel" erstellt und wollte mich nun an die printf herausforderung machen.
Jedoch habe ich schon zum anfang ein riesen problem

ich habe eine kernel.c die in etwa folgendermaßen aussieht:
#include"kprintf.h"

void inti(){
kprintf("hallo");
}

während meine kprintf.h so aussieht:
void kprintf(char mainchar[])
{
        char *video=(char*) 0xb8000;
int i;

for(i=0;i<=sizeof(mainchar);i++)
{
video[i*2]=mainchar[i];
video[i*2+1]=0x07;
}
}
Das lässt sich Kompilieren, aber sobald ich es per qemu und Grub booten will, bekomm ich die fehlermeldung "Error 13:  invalid or unsupported executable format" sobald ich versuche den Kernel zu laden.


//Sobald ich anstatt :
kprintf("hallo");
//dass schreibe:
char mainchar[]="hallo";
kprintf(mainchar);
//funktioniert es

Kann mir jemand erklären warum das so ist?
Ich denke es ist irgendwie ein winziger fehler den ich einfach nicht sehe.

LG aMen
« Letzte Änderung: 23. November 2009, 16:31 von aMen »

DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
Ich würde mal behaupten der Fehler liegt hier am Linkerscript und an den verschiedenen Sektionen. Mach doch einfach mal aus dem char array[]; ein const char *string;.
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

aMen

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
Nunja das Link script ist das aus dem Tutorial:

Zitat
/*  Bei _start soll die Ausfuehrung losgehen */
ENTRY(_start)

/*
 * Hier wird festgelegt, in welcher Reihenfolge welche Sektionen in die Binary
 * geschrieben werden sollen
 */
SECTIONS
{
    /*
     * . ist die aktuelle Position in der Datei. Wir wollen den Kernel wie gehabt
     * an 1 MB laden, also muessen wir dort die erste Sektion hinlegen
     */
    . = 0x100000;

    /*
     * Der Multiboot-Header muss zuerst kommen (in den ersten 8 kB).
     * Die Standardsektionen einfach hintereinander weg einbinden.
     */
    .text : {
        *(multiboot)
        *(.text)
    }
    .data ALIGN(4096) : {
        *(.data)
    }
    .rodata ALIGN(4096) : {
        *(.rodata)
    }
    .bss ALIGN(4096) : {
        *(.bss)
    }
}
Eins zu eins übernommen.

das mit dem const char *string hab ich auch shcon getestet, aber auch da wirft Grub mir einen fehler hinterher.

Laut mbchk ist es auch kein Multiboot header wenn ich versuche den parameter direkt zu übergeben.

LG aMen

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
Schau dir deine Binary am besten mal im Hexeditor an und such dort nach der Multiboot-Magic. Dann siehst du ja, wo der Header gelandet ist. Die Bedingungen sind eigentlich nur, dass er auf eine 32-Bit-Grenze ausgerichet ist und innerhalb der ersten 8k sein muss.

Wobei mir ein Problem mit letzterem bei einem so kleinen Kernel unwahrscheinlich vorkommt, wenn nicht irgendwas völlig schiefläuft. Ist er denn überhaupt größer als 8k?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
ich denke wenn du den kernel aus dem tutorial genommen hast, hast du hoffentlich dass ganze auch im elf32-i586 bzw. elf32-i386 format kompiliert oder? Ich würde schätzen dass du Grub veranlasst eine Windoes-Exe zu laden, die er nicht kennt. Welchen Compiler hast du verwendet? Arbeitest du unter Windows oder Linux? Unter windows solltest du den compiler von jidder nehmen.

EDIT: Übrigens sollte man in HEADER-Dateien keine Funktionsdefintionen reinschreiben. Eigentlich sind Header nur für Deklarationen und Symbole etc. da. Aber daran liegt der Fehler nicht.
« Letzte Änderung: 23. November 2009, 10:20 von sebi2020 »
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

scanish

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
Das ist der selbe fehler wie bei mir. Wie groß ist der Kernel? > 1.0MB?

Übergib -n oder --nmagic and ld und es sollte wieder gehen.

aMen

  • Beiträge: 5
    • Profil anzeigen
Gespeichert
So fehler gefunden,

mein Linkscript hat nur ein punkt an der stelle:
    .text : {
        *([b].[/b]multiboot)
        *(.text)
    }

mein asm war auch mit einem "." angepasst.

Danke an alle die versucht haben zu helfen!

PS: @sebi2020 natürlich weiß ich das sowas normalerweiße nicht in die .h datei gehört, aber es ist so einfacher das Problem zu beschreiben.
« Letzte Änderung: 23. November 2009, 16:33 von aMen »

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
Hm, hätte es nicht funzen müssen wenn im asm auch ein
section .multiboot
stand?
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

 

Einloggen