Re: Linkare staticamente un eseguibile
On Fri, Aug 01, 2003 at 07:19:04PM +0200, Nick Name wrote: - è possibile linkare staticamente solo alcune librerie (per esempio tutte tranne le opengl) ? Si. Ehm, come si fa? L'opzione -static di gcc linka tutto come trova... gli dici di linkare oltre ai file .o anche le librerie .a che vuoi mettere staticamente nel programma. -- Non c'è più forza nella normalità, c'è solo monotonia. pgp8D8l496rq0.pgp Description: PGP signature
[OT] Linkare staticamente un eseguibile
On Sat, 2 Aug 2003 09:37:42 +0200 Ottavio Campana [EMAIL PROTECTED] wrote: gli dici di linkare oltre ai file .o anche le librerie .a che vuoi mettere staticamente nel programma. Ma non funziona affatto! ecco un file di prova: #include stdio.h #include math.h int main() { printf(ciao %f\n,sin(0)); return 0; } e ora... * gcc -c prova.c * gcc /usr/lib/libm.a prova.o -o prova prova.o: In function `main': prova.o(.text+0x11): undefined reference to `sin' collect2: ld returned 1 exit status invece * gcc -lm /usr/lib/libm.a prova.o -o prova funziona ma ovviamente ldd mi ridà la libreria dinamica libm.so Vincenzo
Re: Linkare staticamente un eseguibile
On Fri, 01 Aug 2003 19:30:12 +0200, Nick Name wrote: On Fri, 01 Aug 2003 16:51:45 +0200 Francesco Bochicchio [EMAIL PROTECTED] wrote: - è possibile linkare staticamente solo alcune librerie (per esempio tutte tranne le opengl) ? Si. Ehm, come si fa? L'opzione -static di gcc linka tutto come trova... A questo ti hanno risposto : specifica i .a insieme ai .o. - è possibile prendere un eseguibile linkato dinamicamente e trasformarlo in uno linkato staticamente? Mah, in generale credo di no. Per generare un eseguibile, un linker (tipo ld) ha bisogno di informazioni contenute nei 'relocatable object files'('.o') che di solito un eseguibile non contene piu' (eccetto forse se compilato con le opzioni di debugging). Almeno credo. Però mi pare strano perchè in fondo uno l'eseguibile linkato lo si ricostruisce in memoria con ld.so a partire dall'eseguibile non linkato e dai .so, quindi perchè non si dovrebbe riuscire a ricostruirlo su disco? Boh??? Non ne so abbasanza per darti una risposta certa. La mia impressione gia' te l'ho detta : credo che il passaggio da .o a eseguibile comporti una perdita di informazioni, per cui la cosa non e' reversibile. i .a sono librerie statiche [...] i .so sono librerie dinamiche Quello che mi chiedo è: ma non bastano i .so? Perchè ci vogliono anche i .a, in fondo il codice che contengono è lo stesso o sbaglio? (o viceversa, non bastano solo i .a ?) Il codice e' lo stesso, le 'informazioni ausiliarie' e l'organizzazione della libreria no. Se non sbaglio, Debian installa solo le librerie dinamiche con i pacchetti 'libXXX' (librerie run-time). Le librerie statiche sono di solito contenute solo nei pacchetti di sviluppo (XXX-dev), per permettere agli sviluppatori di linkare staticamente i loro programmi, se cosi' desiderano. Quindi ancora una volta Debian esaudisce i tuoi desideri :-). P.S. : mentre sono certo che da una libreria statica si possa ottenere una libreria dinamica, ho dei dubbi sul contrario : forse anche qui c'e' una perdita di informazione non reversibile (?). Ciao FB
Re: [OT] Linkare staticamente un eseguibile
On Sat, 2003-08-02 at 12:23, Nick Name wrote: On Sat, 2 Aug 2003 09:37:42 +0200 Ottavio Campana [EMAIL PROTECTED] wrote: gli dici di linkare oltre ai file .o anche le librerie .a che vuoi mettere staticamente nel programma. Ma non funziona affatto! ecco un file di prova: #include stdio.h #include math.h int main() { printf(ciao %f\n,sin(0)); return 0; } e ora... * gcc -c prova.c * gcc /usr/lib/libm.a prova.o -o prova prova.o: In function `main': prova.o(.text+0x11): undefined reference to `sin' collect2: ld returned 1 exit status invece * gcc -lm /usr/lib/libm.a prova.o -o prova funziona ma ovviamente ldd mi ridà la libreria dinamica libm.so Vincenzo Che io sappia le librerie statiche *.a devono essere linkate dopo e non prima del main ... Infatti gcc prova.o -o prova /usr/lib/libm.a a me funziona. Ciao Stefano
Re: [OT] Linkare staticamente un eseguibile
On 02 Aug 2003 12:58:29 +0200 Stefano Simonucci [EMAIL PROTECTED] wrote: Che io sappia le librerie statiche *.a devono essere linkate dopo e non prima del main ... Infatti gcc prova.o -o prova /usr/lib/libm.a Sgrunt! Tutto qua! :) Ci ho perso un paio di ore a trovare -Wl,-Bstatic! Grazie Vincenzo -- Ho dato al mio dolore la forma di parole abusate che mi prometto di non pronunciare mai più [CSI]
Re: Linkare staticamente un eseguibile
On Thu, 31 Jul 2003 16:50:13 +0200, Nick Name wrote: Ciao a tutti. Mi chiedo se - è possibile linkare staticamente solo alcune librerie (per esempio tutte tranne le opengl) ? Si. - è possibile prendere un eseguibile linkato dinamicamente e trasformarlo in uno linkato staticamente? Mah, in generale credo di no. Per generare un eseguibile, un linker (tipo ld) ha bisogno di informazioni contenute nei 'relocatable object files' ('.o') che di solito un eseguibile non contene piu' (eccetto forse se compilato con le opzioni di debugging). Almeno credo. - ma quale cacchio è la differenza tra i .so e i .a? Si possono trasformare gli uni negli altri? i .a sono librerie statiche. Quando sono linkate ad un programma vengono copiate fisicamente ad esso (non tutta la libreria, ma i .o usati effettivamente dal programma). i .so sono librerie dinamiche. Quando sono linkate ad un programma non vengono integrate ad esso ma si fa affidamento sul fatto che su qualunque macchina giri ci sia una versione della libreria usata (o una compatibile) e la libreria viene caricata solo al momento del lancio. Le librerie dinamiche sono comode perche' permetttono a piu' programmi di condividere lo stesso codice senza sprecare disco o RAM con piu' copie degli stessi moduli. Inoltre permettono di sostituire una libreria con un altra migliorata senza dovere rilinkare niente. Pero' i .o sono anche piu' lenti. E, in un certo senso, 'creano' il problema delle dipendenze tra pacchetti software. Sia i .a che i .so sono colezioni di .o con informazioni aggiuntive. E' quindi possibile convertire un tipo nell'altro. Non conosco modi per farlo in un colpo solo, ma si possono ad esempio estrarre i .o da un .a con 'ar' e poi usare 'ld' per generare il '.so'. Grazie per la cortese attenzione... cordiali saluti :) Vincenzo Ciao - FB
Re: Linkare staticamente un eseguibile
On Fri, 01 Aug 2003 16:51:45 +0200 Francesco Bochicchio [EMAIL PROTECTED] wrote: - è possibile linkare staticamente solo alcune librerie (per esempio tutte tranne le opengl) ? Si. Ehm, come si fa? L'opzione -static di gcc linka tutto come trova... - è possibile prendere un eseguibile linkato dinamicamente e trasformarlo in uno linkato staticamente? Mah, in generale credo di no. Per generare un eseguibile, un linker (tipo ld) ha bisogno di informazioni contenute nei 'relocatable object files'('.o') che di solito un eseguibile non contene piu' (eccetto forse se compilato con le opzioni di debugging). Almeno credo. Però mi pare strano perchè in fondo uno l'eseguibile linkato lo si ricostruisce in memoria con ld.so a partire dall'eseguibile non linkato e dai .so, quindi perchè non si dovrebbe riuscire a ricostruirlo su disco? i .a sono librerie statiche [...] i .so sono librerie dinamiche Quello che mi chiedo è: ma non bastano i .so? Perchè ci vogliono anche i .a, in fondo il codice che contengono è lo stesso o sbaglio? (o viceversa, non bastano solo i .a ?) Sia i .a che i .so sono colezioni di .o con informazioni aggiuntive. E' quindi possibile convertire un tipo nell'altro. Non conosco modi per farlo in un colpo solo, ma si possono ad esempio estrarre i .o da un .a con 'ar' e poi usare 'ld' per generare il '.so'. Devo provare! Grazie per la risposta Vincenzo
Linkare staticamente un eseguibile
Ciao a tutti. Mi chiedo se - è possibile linkare staticamente solo alcune librerie (per esempio tutte tranne le opengl) ? - è possibile prendere un eseguibile linkato dinamicamente e trasformarlo in uno linkato staticamente? - ma quale cacchio è la differenza tra i .so e i .a? Si possono trasformare gli uni negli altri? Grazie per la cortese attenzione... cordiali saluti :) Vincenzo
Re: Linkare staticamente un eseguibile
On Thu, Jul 31, 2003 at 04:49:16PM +0200, Nick Name wrote: Ciao a tutti. Mi chiedo se - è possibile linkare staticamente solo alcune librerie (per esempio tutte tranne le opengl) ? questo ci devo guardare ma non vedo perche' no :) - è possibile prendere un eseguibile linkato dinamicamente e trasformarlo in uno linkato staticamente? perche' no... man ld ? - ma quale cacchio è la differenza tra i .so e i .a? Si possono trasformare gli uni negli altri? gli .a dovrebbero essere archivi -- mattia :wq!