Thomas Hertweck wrote:
Beim direkten Aufruf der einzelnen Programme cpp, cc1, as, und ld musst Du mitunter noch einiges mehr uebergeben, was Du beim Aufruf ueber gcc nicht musst. Vermutlich brauchst Du beim Linken noch /lib/crt[01n].o (start-up routine), oder aehnliches. Oder Du musst den Entry-Point angeben. Aber damit habe ich mich auch noch nicht beschaeftigt.... :-)
Normalerweise tue ich das auch nicht per Hand, aber ich bin gerade mal neugierig geworden. Also, folgender Ablauf funktionierte bei mir:
$ echo -e '#include <stdio.h>\nmain(){printf("Hello!\n");}' >hello.c $ cpp hello.c >hello.i $ /usr/lib/gcc-lib/i486-linux/egcs-2.91.66/cc1 hello.i [...irgendwelche Ausgaben...] $ as -o hello.o hello.s $ ld -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/crt1.o \ /usr/lib/crti.o hello.o -lc /usr/lib/crtn.o $ ./hello Hello! $
Der Linker-Aufruf war mehr oder weniger Try-and-Error, aber wie man sieht geht's irgendwie. Ich garantiere aber nicht dafür, daß diese Aufrufe vorbildlich sind und werde zukünftig wieder gcc die Wahl der richtigen Argumente überlassen ;-)
Eilert
* Eilert Brinkmann schrieb am 16.Jun.2001:
Normalerweise tue ich das auch nicht per Hand, aber ich bin gerade mal neugierig geworden. Also, folgender Ablauf funktionierte bei mir:
$ echo -e '#include <stdio.h>\nmain(){printf("Hello!\n");}' >hello.c $ cpp hello.c >hello.i $ /usr/lib/gcc-lib/i486-linux/egcs-2.91.66/cc1 hello.i [...irgendwelche Ausgaben...] $ as -o hello.o hello.s $ ld -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/crt1.o \ /usr/lib/crti.o hello.o -lc /usr/lib/crtn.o $ ./hello Hello! $
Interessant ist auch die Größe der Dateien:
$ wc hello* 13 103 11932 hello 3 4 46 hello.c 3162 2015 20345 hello.i 4 12 904 hello.o 25 47 363 hello.s 3207 2181 33590 insgesamt
Man beachte hello.i Muß man gesehen haben. ;)
Ach so:
$ strip hello $ wc hello wc hello 3 34 2316 hello
Und jetzt das Gleiche mit einem bison und/oder flex davor? ;))
Bernd
Hallo Liste,
On Sat, 16 Jun 2001 at 05:16 (+0200), Bernd Brodeßer wrote:
- Eilert Brinkmann schrieb am 16.Jun.2001:
Normalerweise tue ich das auch nicht per Hand, aber ich bin gerade mal neugierig geworden. Also, folgender Ablauf funktionierte bei mir:
$ echo -e '#include <stdio.h>\nmain(){printf("Hello!\n");}' >hello.c $ cpp hello.c >hello.i $ /usr/lib/gcc-lib/i486-linux/egcs-2.91.66/cc1 hello.i [...irgendwelche Ausgaben...] $ as -o hello.o hello.s $ ld -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/crt1.o \ /usr/lib/crti.o hello.o -lc /usr/lib/crtn.o $ ./hello Hello!
auch wenn das Thema schon länger beendet ist (am Quoting dürfte man recht gut erkennen, um was ges damals ging), habe ich jetzt durch Zufall eine schöne Internetseite gefunden
"Wie ein C-Programm aus dem Sourcecode entsteht",
die den einen oder anderen interessieren könnte und zu dieser Thematik passt.
Die URL:
http://kbs.cs.tu-berlin.de/~jutta/unix1/wie-ein-c-programm.html
Gruß, Bernhard