Exe wird zu groß...



  • wenn die echse zu groß wird, weniger füttern!



  • rüdiger schrieb:

    Die C Runtime wird unter Windows/DOS statisch gelinkt. Daher hast du immer einen festen Overhead. Du kannst natürlich versuchen eine kleinere Standard Bib zu bekommen, so was wie die diet libc (gibt es aber nur für Windows).

    (-Os -s -fomit-frame-pointer als Compile-Optionen sollte ein bisschen helfen)

    Wie gesagt: MSVC8 linkt auch dynamisch (sogar per default!). Dann ist ein Helloworld nur 9 KByte klein.



  • Artchi schrieb:

    rüdiger schrieb:

    Die C Runtime wird unter Windows/DOS statisch gelinkt. Daher hast du immer einen festen Overhead. Du kannst natürlich versuchen eine kleinere Standard Bib zu bekommen, so was wie die diet libc (gibt es aber nur für Windows).

    (-Os -s -fomit-frame-pointer als Compile-Optionen sollte ein bisschen helfen)

    Wie gesagt: MSVC8 linkt auch dynamisch (sogar per default!). Dann ist ein Helloworld nur 9 KByte klein.

    Nee, weil du ja noch die DLL brauchst...



  • Eben! dynamisch bedeutet DLL. Nur das die DLL meistens schon auf dem Windows-System installiert ist. Wenn nicht (in der gewünschten Version, eine ist aber mind. immer drauf), kann man ein offizielles entsprechendes C-Runtime-Archiv von der MS-Website downloaden (einmal für alle nutzenden Programme und gut ist).



  • Wenn Du eine kleine EXE willst, dann:
    - verwendet niemals die STL
    - verwende keine MFC/ATL

    wenn Du sie dann noch kleiner haben willst, dann
    - verwende niemals die CRT!

    Damit bekommst Du 2048 Bytes (kleiner geht es nicht; siehe PE-Format):

    #include <windows.h>
    #include <tchar.h>
    #pragma comment(linker, "/entry:entry")
    
    void entry()
    {
      TCHAR szText[] = _T("Hello world\n");
      DWORD dwWritten;
      WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szText, lstrlen(szText), &dwWritten, NULL);
    }
    

    Compilieren mit:

    cl /c /O1 /GS- CPP_VS2005.cpp

    und linken mit:

    link /subsystem:console CPP_VS2005.obj kernel32.lib

    Dies ergibt dann im PE:

    Microsoft (R) COFF/PE Dumper Version 8.00.50727.762
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    Dump of file CPP_VS2005.exe
    
    PE signature found
    
    File Type: EXECUTABLE IMAGE
    
    FILE HEADER VALUES
                 14C machine (x86)
                   2 number of sections
            4694EBC1 time date stamp Wed Jul 11 16:40:01 2007
                   0 file pointer to symbol table
                   0 number of symbols
                  E0 size of optional header
                 103 characteristics
                       Relocations stripped
                       Executable
                       32 bit word machine
    
    OPTIONAL HEADER VALUES
                 10B magic # (PE32)
                8.00 linker version
                 200 size of code
                 200 size of initialized data
                   0 size of uninitialized data
                1000 entry point (00401000)
                1000 base of code
                2000 base of data
              400000 image base (00400000 to 00402FFF)
                1000 section alignment
                 200 file alignment
                4.00 operating system version
                0.00 image version
                4.00 subsystem version
                   0 Win32 version
                3000 size of image
                 400 size of headers
                   0 checksum
                   3 subsystem (Windows CUI)
                 400 DLL characteristics
                       No structured exception handler
              100000 size of stack reserve
                1000 size of stack commit
              100000 size of heap reserve
                1000 size of heap commit
                   0 loader flags
                  10 number of directories
                   0 [       0] RVA [size] of Export Directory
                2020 [      28] RVA [size] of Import Directory
                   0 [       0] RVA [size] of Resource Directory
                   0 [       0] RVA [size] of Exception Directory
                   0 [       0] RVA [size] of Certificates Directory
                   0 [       0] RVA [size] of Base Relocation Directory
                   0 [       0] RVA [size] of Debug Directory
                   0 [       0] RVA [size] of Architecture Directory
                   0 [       0] RVA [size] of Global Pointer Directory
                   0 [       0] RVA [size] of Thread Storage Directory
                   0 [       0] RVA [size] of Load Configuration Directory
                   0 [       0] RVA [size] of Bound Import Directory
                2000 [      10] RVA [size] of Import Address Table Directory
                   0 [       0] RVA [size] of Delay Import Directory
                   0 [       0] RVA [size] of COM Descriptor Directory
                   0 [       0] RVA [size] of Reserved Directory
    
    SECTION HEADER #1
       .text name
          3C virtual size
        1000 virtual address (00401000 to 0040103B)
         200 size of raw data
         400 file pointer to raw data (00000400 to 000005FF)
           0 file pointer to relocation table
           0 file pointer to line numbers
           0 number of relocations
           0 number of line numbers
    60000020 flags
             Code
             Execute Read
    
    RAW DATA #1
      00401000: 55 8B EC 83 EC 14 56 57 BE 10 20 40 00 8D 7D EC  U.ì.ì.VW¾. @..}ì
      00401010: A5 A5 6A 00 8D 45 FC A5 50 8D 45 EC 50 A4 FF 15  ¥¥j..Eü¥P.EìP¤ÿ.
      00401020: 04 20 40 00 50 8D 45 EC 50 6A F5 FF 15 00 20 40  . @.P.EìPjõÿ.. @
      00401030: 00 50 FF 15 08 20 40 00 5F 5E C9 C3              .Pÿ.. @._^ÉÃ
    
    SECTION HEADER #2
      .rdata name
          92 virtual size
        2000 virtual address (00402000 to 00402091)
         200 size of raw data
         600 file pointer to raw data (00000600 to 000007FF)
           0 file pointer to relocation table
           0 file pointer to line numbers
           0 number of relocations
           0 number of line numbers
    40000040 flags
             Initialized Data
             Read Only
    
    RAW DATA #2
      00402000: 68 20 00 00 78 20 00 00 58 20 00 00 00 00 00 00  h ..x ..X ......
      00402010: 48 65 6C 6C 6F 20 77 6F 72 6C 64 0A 00 00 00 00  Hello world.....
      00402020: 48 20 00 00 00 00 00 00 00 00 00 00 84 20 00 00  H ........... ..
      00402030: 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00  . ..............
      00402040: 00 00 00 00 00 00 00 00 68 20 00 00 78 20 00 00  ........h ..x ..
      00402050: 58 20 00 00 00 00 00 00 99 03 57 72 69 74 65 43  X ........WriteC
      00402060: 6F 6E 73 6F 6C 65 41 00 B9 01 47 65 74 53 74 64  onsoleA.¹.GetStd
      00402070: 48 61 6E 64 6C 65 00 00 CC 03 6C 73 74 72 6C 65  Handle..Ì.lstrle
      00402080: 6E 41 00 00 4B 45 52 4E 45 4C 33 32 2E 64 6C 6C  nA..KERNEL32.dll
      00402090: 00 00                                            ..
    
      Section contains the following imports:
    
        KERNEL32.dll
                    402000 Import Address Table
                    402048 Import Name Table
                         0 time date stamp
                         0 Index of first forwarder reference
    
                      1B9 GetStdHandle
                      3CC lstrlenA
                      399 WriteConsoleA
    
      Summary
    
            1000 .rdata
            1000 .text
    


  • es gibt auch bei g++ die möglichkeit dem copilier zu sagen, dass er auf größe optimieren soll. Wenn man die Passende IDE hat, dann kann man sich die ganzen kompilierflags komfortabe ansehen und (de)aktivieren. Der grund für die riesigen exe Dateien sind immer die bibliotheken. Templates und inlinefunktionen können auch stark die die Größe beeinträchtigen, genau wie Makros, aber die hast du ja nicht verwendet.



  • Wusste nicht, das du für Dos programmieren willst.

    Der Compiler hier kann auch 16 Bit, mit den DOS 16 libraries:
    http://www.digitalmars.com/download/freecompiler.html

    Wie gross die exe werden, keine Ahnung.
    🙂



  • ich hab mir mal ein "Hallo Welt"-Programm mit cout geschrieben, und das durch den g++ mit dem compilerflag -Os (auf größe optimieren) laufen lassen, das Ergebnis ist 8338 bytes groß. Also -Os bringt auf jeden Fall etwas, und printf ist da nicht unbedingt besser.



  • @Krux
    häng auch noch mal -s an, das entfernt alle nutzlosen Symbole und Debug-Infos und -fomit-frame-pointer sollte den Code auch noch mal kleiner machen.

    Artchi schrieb:

    Eben! dynamisch bedeutet DLL. Nur das die DLL meistens schon auf dem Windows-System installiert ist. Wenn nicht (in der gewünschten Version, eine ist aber mind. immer drauf), kann man ein offizielles entsprechendes C-Runtime-Archiv von der MS-Website downloaden (einmal für alle nutzenden Programme und gut ist).

    Bringt ihm unter DOS aber immer noch recht wenig 🙄 Und am Ende würde man wohl doch lieber statisch linken, wenn man das Binary weiter geben will.



  • So ich hab nun auch nochmal mit gcc und den Zusatzoptionen probiert. Half alles nichts. 😡
    Ich hab nun in meiner Verzweiflung mir den alten Borland C++ 3.0 mit 9 Disketten 😮 installiert. Das "Hallo Welt" hat nun auch nur 8kb. Aber danke euch allen für die Tipps. 🙂


Anmelden zum Antworten