Discussion:
Groesse der *.exe
(zu alt für eine Antwort)
Helmut Wuensch
2016-09-24 08:53:39 UTC
Permalink
Raw Message
Hallo,

ich habe da noch'ne Anfängerfrage:

Da ich in verschiedenen Lern-Medien
unterwegs bin, ist mir aufgefallen, dass
mit einem anderen C-System die
"Ergebnis"-exe ca. nur ein Viertel so
groß ist, wie meine: Ich arbeite mit MINGW
und die Einfach-exe "Hallo Welt!" ist bei
mir ca. 56 kB groß. (Wenn ich sie ZIPpe,
reduziert sie sich etwa auf die Hälfte.
Meine Erfahrungen mit gepackten, ausführ-
baren Dateien sind jedoch, dass sich diese
nicht komprimieren lassen, oder fast nicht.)
Da ist m.M.n. "viel Luft drin ..."!

Momentan ist mir so Etwas egal, aber
vielleicht für später:

Gibt es optimalere Systeme? (D.h. solche,
die einen [vielleicht] optimaleren Code
produziern?)

Auch da *bedanke* ich mich schon jetzt für
Eure Mühe!

cu Helmut
Peter J. Holzer
2016-09-24 10:39:42 UTC
Permalink
Raw Message
Post by Helmut Wuensch
Da ich in verschiedenen Lern-Medien
unterwegs bin, ist mir aufgefallen, dass
mit einem anderen C-System die
"Ergebnis"-exe ca. nur ein Viertel so
groß ist, wie meine: Ich arbeite mit MINGW
und die Einfach-exe "Hallo Welt!" ist bei
mir ca. 56 kB groß.
Hier (Linux) 4.9 kB bzw. 3.1 kB gestrippt.

Bei so kleinen Programmen (der eigentliche Code ist ja nur ein paar
hundert Bytes) hängt die Größe des Executables haupsächlich davon ab,
wieviel Library-Code mit in das Executable gepackt wird und wieviel in
Shared Libraries ausgelagert ist. Ein 56 kB großes Hello-World dürfte
wohl statisch gelinkt sein (also den notwendigen Code aus Librarys
enthalten).
Post by Helmut Wuensch
Gibt es optimalere Systeme? (D.h. solche,
die einen [vielleicht] optimaleren Code
produziern?)
Generell halte ich die Größe von Hello, World für eher uninteressant. Es
gibt ein paar Grenzbereiche, wo das relevant ist, aber im Allgemeinen
sagt das wenig über die Größe und Performance von realistischen
Programmen aus.

hp
--
_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | ***@hjp.at | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel
Frank Tetzel
2016-09-24 11:20:47 UTC
Permalink
Raw Message
Post by Helmut Wuensch
Da ich in verschiedenen Lern-Medien
unterwegs bin, ist mir aufgefallen, dass
mit einem anderen C-System die
"Ergebnis"-exe ca. nur ein Viertel so
groß ist, wie meine: Ich arbeite mit MINGW
und die Einfach-exe "Hallo Welt!" ist bei
mir ca. 56 kB groß. (Wenn ich sie ZIPpe,
reduziert sie sich etwa auf die Hälfte.
Meine Erfahrungen mit gepackten, ausführ-
baren Dateien sind jedoch, dass sich diese
nicht komprimieren lassen, oder fast nicht.)
Da ist m.M.n. "viel Luft drin ..."!
Momentan ist mir so Etwas egal, aber
Gibt es optimalere Systeme? (D.h. solche,
die einen [vielleicht] optimaleren Code
produziern?)
Was ist optimaler? Es gibt mehrere Kriterien nach denen man bzw. der
Compiler optimieren kann. Du zielst wohl eher auf minimale
Binärcodegröße ab und nicht auf die schnellste Ausführungszeit.

Kleiner Disclaimer: Ich bin Linux-Nutzer. Das Folgende kann unter
Umständen nicht so 100% in MingW funktionieren.

Wenn noch nicht geschehen, schalte die Optimierung für codesize an,
-Os. Vermeide Debugsymbole, kein -g. Über den Linker kannst du noch
weitere Symbolinformationen ausfiltern, -Wl,-s. Danach kann man das
Programm natürlich nicht mehr gescheit debuggen.

"hello world" gebaut mit:
gcc -Os -Wl,-s hello.c -o hello

erzeugt bei mir eine 6,1k große Ausführungsdatei. Unter Windows kann das
anders aussehen.

Es gibt dann noch weitere Möglichkeiten es zu verkleinern, z.B. sstrip
unter Linux. Die sind aber in der Regel speziell für das jeweilige
Binärformat angepasst.

Desweiteren seien noch Komprimierungsprogramme speziell für
Ausführungsdateien am Rande erwähnt, z.B. upx[1]. Für so kleine
Programme sind die allerdings nicht gedacht, und sobald du mehr als die
Ausführungsdatei verteilen willst, sind sie eher kontraproduktiv.


[1] https://upx.github.io/

Grüße,
Frank
Helmut Wuensch
2016-09-24 13:51:36 UTC
Permalink
Raw Message
Auch Euch Beiden ein großes *Dankeschön*!

Mit den Schaltern habe ich mich (leider aus Mangel
an Wissen) noch nicht so beschäftigt.

cu Helmut
Helmut Schellong
2016-09-25 18:38:49 UTC
Permalink
Raw Message
Post by Helmut Wuensch
Hallo,
Da ich in verschiedenen Lern-Medien
unterwegs bin, ist mir aufgefallen, dass
mit einem anderen C-System die
"Ergebnis"-exe ca. nur ein Viertel so
groß ist, wie meine: Ich arbeite mit MINGW
und die Einfach-exe "Hallo Welt!" ist bei
mir ca. 56 kB groß.
[...]

Das ist stark plattform-abhängig.

Man kann
o die Library statisch (lib.a) oder dynamisch (lib.so) hinzubinden.
o die Exe strippen (Option -s oder Kommando strip)

Es kommt darauf an, wie groß einzelne Lib-Stücke sind!
Früher konnte ich statische Exe haben mit nur 700 Byte Größe!
Heute ist sie mindestens etwa 450000 Byte groß, wenn man
irgendwas aus der Lib benutzt.

Früher hatte man jede einzelne Funktion als xyz.o vorliegen,
die alle in eine libxyz.a gepackt wurden, ein Archiv, das
mit dem Kommando ar bearbeitet wurde.
Heute macht man sich nicht mehr diese Mühe (?), sondern
packt (fast) die gesamte Funktionsmenge in eine einzige
abc.o in libabc.a.

Dies geht noch weiter:
Unter FreeBSD kann ich noch x86_64 statisch linken.
x86_32 geht nicht mehr statisch.
Unter SUSE Linux 11.0 ging es noch statisch.
Unter SUSE Linux 42.1 geht statisch überhaupt gar nichts mehr!
Der Linker meldet: -lc und -lm not found

Dynamisch: 250000 Byte
Statisch: 770000 Byte (stripped)
850000 Byte (unstripped)
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Loading...