Newsgroup: it.comp.macintosh
Titolo: very fat compilation

Hola,
E' normale che certi compilatori creino files molto grandi anche per
programmi di poche linee?
Ad esempio con il compilatore Pascal di Fink (qualcuno lo usa?)
se compilo un "hello world" come
---
program HelloWorld;
begin
        writeln('Hello World');
end.
---
gpc hello.pas -o hello
ottengo:
-rwxr-xr-x  1 salvo  admin  787580 17 Ago 17:28 hello
-rw-r--r--  1 salvo  admin           57 17 Ago 17:28 hello.pas
Sbaglio o è un programma di quasi un 1 MB?
Idem per altri programmi più lunghi.
Lo stesso dicasi in C++
g++ hello -o hello
-rwxr-xr-x  1 salvo  admin  668360 18 Ago 12:01 hello
-rw-r--r--  1 salvo  admin          136 18 Ago 11:59 hello.cpp
Invece in C non avviene
gcc hello.c -o hello
-rwxr-xr-x  1 salvo  admin  11532 20 Lug 18:38 hello
-rw-r--r--  1 salvo  admin     58 20 Lug 18:38 hello.c
C'è un modo di "sgonfiare" queste compilazioni?
salvo
-- 
#!/usr/bin/perl
print "NeXT tip => /me == (~§alvomi©~ @ddress) - (Alfa kai Omega) \n";

 Idem per altri programmi piů lunghi.
Non c'entra con il thread, ma ti do un piccolo hint (sempre che tu ne
abbia bisogno). Prova ad usare l'opzione -h di ls (magari mettendolo tra
gli alias). In questo modo invece che:
[kral@aleph:~/Code/perl] ls -l
total 328
-rw-r-----   1 kral  kral     944 18 Ago 00:24 MacGlue_es1.pl
-rw-r-----   1 kral  kral   37039 30 Ago 22:33 PDFFarm.zip
-rwxr-x---   1 kral  kral    1041 18 Ago 23:51 PDF_p1.pl
tu ottenga:
[kral@aleph:~/Code/perl] ls -lh
total 328
-rw-r-----   1 kral  kral    944B 18 Ago 00:24 MacGlue_es1.pl
-rw-r-----   1 kral  kral     36K 30 Ago 22:33 PDFFarm.zip
-rwxr-x---   1 kral  kral      1K 18 Ago 23:51 PDF_p1.pl
Ciao,
-- 
+--------+ | ASCII ribbon campaign ( ) | 
www.autistici.org/kral
|  kral  | |  - against HTML email  X  |
+--------+ |              & vCards / \ | my gpg id = 0x7C946947

 
Bisognerebbe studiare il compilatore pascal, forse compila staticamente 
qualche libreria.

 abbia bisogno). Prova ad usare l'opzione -h di ls
grazie dell'hint.
In effetti -h lo uso con df e du spesso, cosě diventano piů "umani" :)
Ma mi viene sempre hello 761k, decisamente troppi.
ciao,
Salvo

 qualche libreria.
ok, ma anche G++ (gcc) per C++ ?
Ora, non ricordo più com'era in Windows e FreeBSD, ma qui in mac c'è un
obesità preoccupante :)
ciao,
Salvo

 Ma mi viene sempre hello 761k, decisamente troppi.
In effetti sono troppi, ma il mio non era un hint per risolvere il
problema :)
Visto che eri titubante sulla dimensione, ho pensato di darti una
dritta... tutto qua :)


 ok, ma anche G++ (gcc) per C++ ?
Beh... pensa che il compilatore deve creare un oggetto con tanto di
metodo per scrivere a schermo la solita stringa, creare un main,
istanziare l'oggetto e fargli fare quello per cui è stato creato.
Ti credo che in C viene pochi KB mentre in C++ ti viene enorme!
-- 
S'ciao!
Walla
------=* Roberto Waha - 
robert...@retro-it.org
 *=-----+ () ASCII
    El Senyor és la meva força, el Senyor el meu cant.   | /\ Ribbon
Ell m'ha estat la salvació. En Ell confío, i no tinc por.| Campaign
---------------* 
http://www.retro-it.org
 *---------------+ NO HTML Mail

 problema :)
sě, sě, grazie, ti avevo capito :)
in effetti -h č utile sempre.
ciao,
salvo

 Ti credo che in C viene pochi KB mentre in C++ ti viene enorme!
:-)
Dovremmo definire una "Fat OOP"? :))
Ma anche Pascal, che non ama gli oggetti crea eseguibili pesanti...
ciao,
salvo

 -rw-r--r--  1 salvo  admin          136 18 Ago 11:59 hello.cpp
Puzza molto di link statico del runtime, visto che nel caso del C
questo scompare.
Come e` la crescita al crescere del sorgente ?
Dopo uno strip quanto rimane ?
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico e fancazzista 
\/

 Dopo uno strip quanto rimane ?
non so. Che prove posso fare?
ciao,
salvo

 non so. Che prove posso fare?
Piu` che prove, navigati l'info del GCC e cerca le opzioni per
forzare il link dinamico.


 forzare il link dinamico.
Provato con g++ -dynamic file.cpp -o file
Idem.
Ad es:
---codice
#include <iostream>
using namespace std;
int main()
{
  int a[] = {1234, 34, 0, 5};
  cout << "a = " << a << endl;
  cout << "*a = a[0] = " << *a << endl;
}
---codice
mi dà:
-rwxr-xr-x  1 salvo  admin  668360  1 Set 22:02 arraypuntatoredinamico
-rwxr-xr-x  1 salvo  admin  668360 21 Ago 13:10 arraypuntatore
-rw-r--r--  1 salvo  admin          158 21 Ago 13:09 arraypuntatore.cpp
Sono solo sei righe di codice e un array...
Potresti provare a compilarlo e vedere cosa fa da te?
Grazie mille.
-- 
salvo

 Idem.
Infatti. E sulla Linux box 5 kbyte. Mi puzza che parte del runtime sia
definito in una libreria statica...


 definito in una libreria statica...
quindi il problema non è mio, ma di gcc e gpc ?
E potremmo fare qualcosa? configurare?
Idee?
ciao, grazie
salvo
-- 
non voglio sprecare megabyte solo per fare esercizi in C++ e Pasqual

 E potremmo fare qualcosa? configurare?
Probabilmente. Ci vorrebbe qualcuno con un buon bagaglio di esperienza
sotto Mac OS X


 sotto Mac OS X
Siete tutti invitati :)
ciao,
salvo

 definito in una libreria statica...
come mi hanno suggerito su it.comp.lang.c++ ho provato
strip hello
ed ecco i risultati:
-rwxr-xr-x  1 salvo  admin    652K  2 Set 17:53 hello
-rw-r--r--  1   salvo  admin    136B 18 Ago 11:59 hello.cpp
-rwxr-xr-x  1 salvo  admin    364K  2 Set 17:55 hellostrip
ovvero si riduce di circa la metà, ma non certo ai 5kb che dovrebbe!
Qualcuno diceva che con g++ 3.2 non succedeva.
Bug del g++ 3.3?
ciao,
salvo

 ovvero si riduce di circa la metà, ma non certo ai 5kb che dovrebbe!
Prova per curiosita` ad usare l'opzione -g per avere il pieno supporto
per gdb :)


 per gdb :)
provato, ma non riduce :)
Invece con g++2 si passa da 600kb a 130kb: il problema è di g++3.3,
dunque.
ciao,
Salvo

 Ma mi viene sempre hello 761k, decisamente troppi.
E perche` di grazia?
-- 
RiK0
Non credo negli schemi non vincenti.

 obesità preoccupante :)
Il gcc ha un problema simile anche sotto Windows, per quanto ricordi.


 definito in una libreria statica...
Esattamente questo.


 sotto Mac OS X
Gia` fatto ;) [ chiaramente non da me ;) ]


 E perche` di grazia?
perché con g++2 scendo a 100, e dopo strip anche a 90.
Dunque g++3.3 che ci mette dentro?
ciao,
salvo

 Il gcc ha un problema simile anche sotto Windows, per quanto ricordi.
sì, su it.comp.lang.c++ mi dicono che sia "per problemi legali", e pare
che ...aggiungano roba dentro apposta.
E qui?
ciao,
salvo

 Esattamente questo.
Ho trovato questo: linka staticamente iostream.h
Dunque, poniamo un semplice
int main() {}
compilato in aaa
e
#include <iostream>
int main(){}
compilato in aaa2
ho
-rwxr-xr-x  1 salvo  admin     11K  3 Set 00:06 aaa
-rw-r--r--  1   salvo  admin     30B  3 Set 00:07 aaa.cpp
-rwxr-xr-x  1 salvo  admin    648K  3 Set 00:07 aaa2
perciň sono solo 11kb, ma con la libreria divengono 648...
E non si puň linkare dinamicamente, giusto?
ciao,
salvo

 Dunque g++3.3 che ci mette dentro?
altrove risposi :))


 E qui?
Nulla... solo 'vecchia' versione.


 Ho trovato questo: linka staticamente iostream.h
imho linka gran parte della stdlibc++
iostream.h e` un header, non una libreria.


 iostream.h e` un header, non una libreria.
hai ragione,
mi ero confuso con il fatto che aggiungendo <iostream> aumenta la
dimensione, è la stdlibc++ ovviamente...
-- 
salvo


ciao :)
salvo

 provato, ma non riduce :)
Infatti, doveve ingrassare :)
Intanto ho passato la domanda al mio amico e vi rigiro la risposta.
# Passro' la domanda a chi ne sa di piu'. Ho provato a compilare il
# tuo test ottenendo (ovvio) lo stesso risulatato. Nota comunque che il
# risulato finale e' con tutti i simboli usati dal linker e un minimo
# di siboli per gdb se strippi il risultato ti viene
# gcc  -x c++ test.cpp -o test -lstdc++     
# ->    -rwxr-xr-x  1 marco  admin  668360  2 Sep 09:56 test*
# strip test                                 
# ->    -rwxr-xr-x  1 marco  admin  373276  2 Sep 09:57 test*
[Niente di nuovo sul fronte occidentale. NdS]
# E un bel po' di roba se ne e' andata (prova a fare un nm prima e
# dopo). Per quanto riguarda cosa viene linkato di sicuro libc (perche'
# gcc ce la attacca sempre), e stdc++ (perche' ce la ho messa io
# altrimenti non linka). Se ti vai a vedere stdc++ :
# --r--r--  1 root  wheel  2950464 12 Sep  2003 
# /usr/lib/gcc/darwin/3.3/libstdc++.a
# e
# -r--r--r--  1 root  wheel  236952 12 Sep  2003 
# /usr/lib/gcc/darwin/default/libgcc.a
[TA-DAH (a la Superpippo): sono librerie statiche e non shared! Niente
 formato ELF per gli eseguibili ? Ahi ahi ahi... :) :) ]
# non e' tanto male cosiderando libstdc++.a e' enorme. Comunque
# considerando che:
# #include <stdio.h>
# int main()
# {
#     int a[] = {1234, 34, 0, 5};
# 
#     printf("a = %p\n", a);
#     printf("a = a[0] = %d\n", *a);
# }
# gcc -o test2 test.c	->	11532  2 Sep 10:19  test2*
# strip test2	->	9516  2 Sep 10:20 test2*
# e' ancora troppa roba, e nota che se provi:
# #include <iostream>
# //using namespace std;
# int main()
# {
#     int a[] = {1234, 34, 0, 5};
# 
# #if 0
#     cout << "a = " << a << endl;
#     cout << "*a = a[0] = " << *a << endl;
# #else
#     printf("a = %p\n", a);
#     printf("a = a[0] = %d\n", *a);
# #endif
# }
# non cambia nulla Io penso che gcc non sappia gestire dead code
# stripping in C++. Dal momento che C++ usa vtables per chiamare
# funzioni il compilatore non sa esattamente che fuzioni sono in uso
# in un oggetto e cosi' non sa cosa togliere (dopotutto sono tutti
# puntatori). Per questa ragione non ci prova neppure.
# Ma non sono sicuro, spero che mi sappiano dire di piu' ...
Questa e`  la risposta  del mio  amico che lavora  in Infinite  Loop a
Cupertino, spero vi sia utile.


 Il gcc ha un problema simile anche sotto Windows, per quanto ricordi.
Ni. Se usi il link contro le DLL non hai bestioni enormi.


 Cupertino, spero vi sia utile.
grazie, molto istruttiva.
conferma anche le nostre ipotesi: con C++ ci mette parte della libreria
standard, con C no.
ok, ciao
-- 
sm

 Ni. Se usi il link contro le DLL non hai bestioni enormi.
Eh... ma mi sembrava che con il C++ non si potesse fare... c'erano state
delle persone che si lamentavano prorprio di quello su it.comp.lang.c++


 standard, con C no.
Per forza :))
Il C non se ne fa moltissimo della libreria standard del C++ :)


 delle persone che si lamentavano prorprio di quello su it.comp.lang.c++
Ho usato il C puro, non il C++...


 Ho usato il C puro, non il C++...
E`, infatti :))
AFAIR il problema c'era solo con il C++ :)
