Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: aMen am 23. November 2009, 00:27

Titel: [Solved]'Invalid or unsupported executable format' bei übergabe von Parametern
Beitrag von: aMen am 23. November 2009, 00:27
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
Titel: Re: 'Invalid or unsupported executable format' bei übergabe von Parametern
Beitrag von: DerHartmut am 23. November 2009, 00:33
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;.
Titel: Re: 'Invalid or unsupported executable format' bei übergabe von Parametern
Beitrag von: aMen am 23. November 2009, 01:14
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
Titel: Re: 'Invalid or unsupported executable format' bei übergabe von Parametern
Beitrag von: kevin am 23. November 2009, 08:55
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?
Titel: Re: 'Invalid or unsupported executable format' bei übergabe von Parametern
Beitrag von: sebi2020 am 23. November 2009, 10:18
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.
Titel: Re: 'Invalid or unsupported executable format' bei übergabe von Parametern
Beitrag von: scanish am 23. November 2009, 12:27
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.
Titel: Re: 'Invalid or unsupported executable format' bei übergabe von Parametern
Beitrag von: aMen am 23. November 2009, 16:31
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.
Titel: Re: [Solved]'Invalid or unsupported executable format' bei übergabe von Parametern
Beitrag von: sebi2020 am 23. November 2009, 20:30
Hm, hätte es nicht funzen müssen wenn im asm auch ein
section .multiboot
stand?