Re: Linkare staticamente un eseguibile

2003-08-02 Per discussione Ottavio Campana
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

2003-08-02 Per discussione Nick Name
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

2003-08-02 Per discussione Francesco Bochicchio
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

2003-08-02 Per discussione Stefano Simonucci
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

2003-08-02 Per discussione Nick Name
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

2003-08-01 Per discussione Francesco Bochicchio
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

2003-08-01 Per discussione Nick Name
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

2003-07-31 Per discussione Nick Name
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

2003-07-31 Per discussione Mattia Dongili
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!