Article View: de.comp.lang.c++
Article #137Re: Hello World - warum so gross?
From: Kristian Köhntopp
Date: Mon, 14 Aug 1995 07:57
Date: Mon, 14 Aug 1995 07:57
114 lines
5088 bytes
5088 bytes
In <YrjLwYkkusiW084yn@unidui.uni-duisburg.de> sa021pl@unidui.uni-duisburg.de (Joerg Pleumann) writes:
>1) Das uebliche Hello-World in C mit stdio.h war bei Weglassen aller
> Symbolinformationen immer noch satte 24 KB groá. Ein bisschen happig
> fuer die simple Ausgabe eines konstanten Textstrings.
Zunaechst einmal hast Du fuer die Ausgabe des Strings die
Funktion printf() verwendet. Das bedeutet, dass auch format()
und eine ganze Galerie weitere Funktionen aus der libc.a mit zu
Deinen Programm dazugebunden werden muessen, weil sich printf()
auf diese Funktionen beruft, um seine Dausgabe zu erzeugen.
(Anmerkung: Diese Erklaerung gilt nur, wenn Du auf einem System
arbeitest, auf dem die libc statisch zu Deinem Programm gebunden wird.
Wenn Du eine libc_s.a bzw. eine LIBC.DLL hast, kommen durch
Verwendung von printf() kaum weitere Funktionen dazu).
Viele moderne Unices erlauben ausserdem, direkt aus der
Objektdatei zu pagen. In diesem Fall wird beim Aufruf des
Programms der Code des Programmes nicht geladen, sondern nur in
den virtuellen Speicher gemapped und zwar so, dass das Mapping
fuer Textsegmente und nicht beschreibbare Datensegmente nicht in
die Auslagerungsdatei zeigt, sondern direkt in die
Programmdatei. Dadurch wird Platz in der Auslagerungsdatei
eingespart.
Durch die Ausfuehrung des Programmes werden dann Seitenfehler
erzeugt, die das Laden der Programmseiten in den Speicher direkt
aus der Programmdatei erlauben, ohne dass die Auslagerungsdatei
bemueht werden muss. Damit das funktioniert, muessen die
Programmsegmente in der Programmdatei aber genau so gross sein,
wie die Speicherseiten, die von der Speicherverwaltung des
Systems verarbeitet werden. Das bedeutet also, dass die Segmente
in der ausfuehrbaren Datei auf eine Seitengroesse aufgefuellt
werden.
Hier unter Nextstep auf einer NeXTstation (Motorola 680x0,
Seitengroesse 8 KB, paging aus Programmdateien):
kris@black /tmp> cat probe.c
main()
{
printf("Hello, world\n");
}
kris@black /tmp> cc -v
Reading specs from /lib/m68k/specs
NeXT Computer, Inc. version cc-216.obj~13, gcc version 2.2.2
kris@black /tmp> cc -o probe probe.c
kris@black /tmp> cc -g -o probe-symdeb probe.c
kris@black /tmp> cc -s -o probe-strip probe.c
kris@black /tmp> cc -s -object -o probe-strip-merge probe.c
kris@black /tmp> l pro*
-rwxr-xr-x 1 kris wheel 48952 Aug 14 09:29 probe*
-rwxr-xr-x 1 kris wheel 16384 Aug 14 09:29 probe-strip*
-rwxr-xr-x 1 kris wheel 1252 Aug 14 09:33 probe-strip-merge*
-rwxr-xr-x 1 kris wheel 49660 Aug 14 09:39 probe-symdeb*
-rw-r--r-- 1 kris wheel 39 Aug 14 09:29 probe.c
Das Programm probe ist ohne Stripping entstanden. Es enthaelt
Segmente und Symboltabellen, jedoch keine ausreichende
Information fuer symbolisches Debugging. Mit der Option -g wird
symdeb-Information in die Objektdatei eingebracht und die Datei
wird noch etwas groesser.
Stripping bringt nicht sonderlich viel, weil die Segmente der
Programmdatei auch in probe-strip noch aufgeblasen werden. Erst,
wenn man erlaubt, dass die Segmente nicht aufgeblasen werden,
bekommt man die minimale Programmgroesse unter Verwendung von
printf().
Man kann das Programm natuerlich noch weiter verkleinern, indem
man es ein wenig aendert:
kris@black /tmp> cat p2.c
static char text[]="Hello, world\n";
main()
{
write(1, text, 13);
}
kris@black /tmp> cc -O4 -S -o p2.s p2.c
kris@black /tmp> cat p2.s
.data
_text:
.ascii "Hello, world\12\0"
.text
.align 1
.globl _main
_main:
link a6,#0
pea 13:w
pea _text
pea 1:w
jbsr _write
unlk a6
rts
kris@black /tmp> cc -O4 -object -s -o p2 p2.c
kris@black /tmp> ./p2
Hello, world
kris@black /tmp> l p2
-rwxr-xr-x 1 kris wheel 1188 Aug 14 09:49 p2*
Aber wie man sieht, bringt es das auch nicht. Unter Nextstep
brauchen die Load-Commands des MachO Objektformates den
restlichen Platz von einem KB. Mit otool bekommt man sie
aufgelistet.
Kristian
--
Kristian Koehntopp, Wassilystrasse 30, 24113 Kiel, +49 431 688897
".sig 1-.sig 3 were sabotaged during editing. .sig 4 disappeared
24 hours after completion. .sig 5 was our last best hope for peace.
It failed. In the year of the Editor War...." -- stolen from Ron Peterson
Technical Details
Message-ID:
<DDAJF3.FwJ@white.schulung.netuse.de>Path:
arc1-ca.pugleaf.net!white.schulung.netuse.de!krisReferences:
<YrjLwYkkusiW084yn@unidui.uni-duisburg.de>Show Full Headers
Complete Article Headers
Newsgroups: de.comp.lang.c++,de.comp.lang.c Path: arc1-ca.pugleaf.net!white.schulung.netuse.de!kris From: kris@white.schulung.netuse.de (Kristian Köhntopp) Subject: Re: Hello World - warum so gross? X-Excuse: X-Copyright wegen Emma, Suedwestpresse und /C'T/DISKUSSIONEN. Organization: YAFLI Message-ID: <DDAJF3.FwJ@white.schulung.netuse.de> References: <YrjLwYkkusiW084yn@unidui.uni-duisburg.de> Date: Mon, 14 Aug 1995 07:57:02 GMT X-Copyright: (C) Copyright 1995 Kristian Koehntopp -- All rights reserved. Reproduktion, auch auszugsweise, ausserhalb elektronischer, nichtkommerzieller Datennetze nur mit ausdruecklichem, schriftlichem Einverstaendnis des Autors.