Compiler mit kleinsten Executables



  • @SideWinder

    Habe die Aussage:
    Da müsste dann ja nur ein Programm vorher ausgeführt werden,
    ...

    ...so interpretiert, dass man damit die 2 Bytes ausgeführt werden können vorher noch ein anderes Programm gestartet werden muss. Das heisst die 2 Bytes wären "alleine" nicht lauffähig, man müsste vorher schon was getan haben, dass aber auch eine bestimmte länge an Code braucht...

    Ja, hoffe keinen Denkfehler gemacht zu haben...

    cu,
    Lukas

    [ Dieser Beitrag wurde am 12.06.2002 um 21:48 Uhr von Consystor editiert. ]



  • Oje 19 Bytes. Mal gucken ob das Prog noch auf meine 21990232555520 Byte Festplatte draufpasst 😃 😉 :p 🙄

    mfg

    PS: 21990232555520 bytes müssten doch rund 20 Gix sein, wenn ich mich nicht verrechnet hab. 🙂



  • Original erstellt von Chris++:
    **Oje 19 Bytes. Mal gucken ob das Prog noch auf meine 21990232555520 Byte Festplatte draufpasst 😃 😉 :p 🙄
    **

    Die Kosten für den Verzeichniseintrag sind ja schon größer als der Datei Inhalt (nein, kein amerkanistischer Getrenntschreibfehler, that's Genitiv). Mit ner Clustersize von 16kb auf ner großen FAT-Platte kommste auf ein Schrott-Zu-Nutzdatenverhältnis von 800/1.



  • Ah... und das heißt? 😮



  • das jedes programm immer nur auf der Festplatte in 16 kb schritten gespeichert wird 😑 machst du Text Datei mit einem Zeichen -> 16 KB auf Festplatte weg, machst du Textdaei mit 16 KB und 1 Byte -> 32 KB weg usw... ist leider Verwaltungstechnisch nötig sonst würden da diverse Dinge vielzuviele Daten zu verwalten haben



  • Achso. D.H. ich müsste jetzt meine Zahl nochmal durch 16 teilen um an das richtige ergebniss zu kommen.



  • man nehme ein perfektes ffs dateisystem mit selbst festzulegender blockgröße und automatischer defragmentierung durch klasse (net)bsd dateisystemtechnik 😃 😃



  • @Chris++: Nein, eigentlich nicht. Du musst nur damit rechnen, dass eine Datei mit 1kb 16kb belegt. Die Größe herauszufinden ist unter Windows sehr einfach: Datei -> Rechtsklick -> Eigenschaften. Dann steht unter Größe, z.B.:

    Größe: 1,50 KB (1.536 Byte), 16.384 Byte belegt

    MfG SideWinder



  • Original erstellt von Chris++:
    Oje 19 Bytes. Mal gucken ob das Prog noch auf meine 21990232555520 Byte Festplatte draufpasst 😃 😉 :p 🙄

    Was, du hast eine 21 Terrabyte Festplatte ? 😉
    Vielleicht sollte ich mir auch so eine zulegen. Meine 100GB sind schon fast voll.

    [ Dieser Beitrag wurde am 13.06.2002 um 21:34 Uhr von DrZoidberg editiert. ]



  • http://www.farb-rausch.com/ -> look out for 16byte!!!! demo [fr-016]



  • jo, und bitte auch mal disassemblieren 😃 versteht einer was da genau abgeht?



  • Disassembliert siehts so aus:

    :0001.0100 B013                   mov al, 13
    :0001.0102 CD10                   int 10
    :0001.0104 C42F                   les bp, [bx]
    
    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:0001.010E(U)
    |
    :0001.0106 AA                     stosb
    :0001.0107 11F8                   adc ax, di
    :0001.0109 6413066C04             adc ax, fs:[046C]
    :0001.010E EBF6                   jmp 0106
    

    naja... das soll mal einer durchblicken :p
    So wie ich das sehe, sind da ziemlich viele Annahmen im Spiel. was ist bx beim start, worauf zeigt ds:si, was ist fs, di und ax? Naja sowas geht auch nur unter DOS. 😃



  • achja, fs:[046C] wird wahrscheinlich auf den bildschirmspeicher zeigen. Der erste int 10 schaltet dann wohl in den grafikmodus um.
    Und es ist ne ganz hübsche endlosschleife 😉



  • Also auf Deutsch gesagt, bringt das Programm absolut nichts?

    MfG SideWinder



  • Shade Of Mine schrieb:

    Kleiner gehts AFAIK nicht mehr.

    wenn man dem linker auch ein kleines /align gibt, darf man das /filealign auch runtersetzen.
    man kann nen kleineren stub nehmen.
    macht zusammen 576 bytes.

    #pragma comment(linker,"/FILEALIGN:16")
    #pragma comment(linker,"/ALIGN:16")
    //#pragma comment(exestr,"<< (c) Volkard Henkel >>")
    #pragma comment(linker,"/IGNORE:4078")
    #pragma comment(linker,"/IGNORE:4089")
    #pragma comment(linker,"/MERGE:.rdata=.text")
    #pragma comment(linker,"/MERGE:.data=.text")
    #pragma comment(linker,"/SECTION:.text,ERW")
    
    #pragma comment(linker,"/nodefaultlib")
    #pragma comment(linker,"/incremental:no")
    #pragma comment(linker,"/entry:crtmain")
    #pragma comment(linker,"/subsystem:console")
    
    //der stub ist von http://its.mine.nu/html/coding/essays/stub.html
    #pragma comment(linker,"/IGNORE:4060")
    #pragma comment(linker,"/stub:stub.exe")
    
    #pragma optimize("s",on)
    
    #include <windows.h>
    
    int __stdcall crtmain()
    {
    	DWORD bytesWritten;
    	WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),"hello, world!",13,&bytesWritten,NULL);
    	return 0;
    }
    /*
    26.02.2004  03:56               576 test1.exe
                   1 Datei(en)            576 Bytes
    */
    


  • (korbinian: sry! hab ausbersehen hier editiert. mach deinen beotrag bitte wieder rein)



  • *vielleicht* das symbolische linken?



  • was meinst du mit symbolischem linken?



  • sory, hab da was durcheinander gebracht und aus versehen deinen beitrag bearbeitet statt zitiert 😞

    hab das -s flag von ln mit dem -s (static) von ld verwechselt. sry 😞



  • na super... jetz hab ich grad die datei gelöscht, weil ich gedacht hab, das steht eh noch herin. also noch ein mal. ich hab dafür noch 2 optimierungsmethoden gefunden. 🙂

    void printf_mini(const char* text, unsigned int size) {
      asm ( "int $0x80\t\n" : : "a"(4), "b"(2), "c"(text), "d"(size) );
      return;
    }
    void exit_mini(unsigned int return_code) {
      asm ( "int $0x80\t\n" : : "a"(1), "b"(return_code) );
      return;
    }
    
    int main(void) {
      printf_mini("Hello World!\n", 13);
      exit_mini(0);
      return 0;
    }
    

    gcc -Os -mregparm=2 -fomit-frame-pointer -c test.c
    ld -s --entry=main -o test test.o
    objcopy --remove-section .comment test
    objcopy --remove-section .data test
    objcopy --remove-section .bss test

    gcc hat version 3.2.2. verschiedene gcc versionen produzieren anderen code. hab jetz nur gcc 3.3.3 noch getestet. der braucht mehr code. vielleicht schaffen es andere versionen mit weniger code.

    ./test
    Hello World!
    test ist 380 byte groß.

    das -s flags heißt nicht static sondern --strip-all. dh es entfernt unnötige daten, wie symbole und so, aus dem output.


Anmelden zum Antworten