<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <TITLE>The Linux GCC HOWTO : Installazione e impostazione di GCC</TITLE> <LINK HREF="GCC-HOWTO-4.html" REL=next> <LINK HREF="GCC-HOWTO-2.html" REL=previous> <LINK HREF="GCC-HOWTO.html#toc3" REL=contents> </HEAD> <BODY> <A HREF="GCC-HOWTO-4.html">Avanti</A> <A HREF="GCC-HOWTO-2.html">Indietro</A> <A HREF="GCC-HOWTO.html#toc3">Indice</A> <HR> <H2><A NAME="s3">3. Installazione e impostazione di GCC</A></H2> <H2><A NAME="index.14"></A> <A NAME="index.13"></A> <A NAME="index.12"></A> <A NAME="ss3.1">3.1 Versioni GCC</A> </H2> <P>È possibile scoprire quale versione GCC si sta eseguendo digitando <CODE>gcc -v</CODE> alla richiesta dell'interprete comandi. Si tratta di un metodo piuttosto affidabile anche per scoprire se la propria impostazione è ELF o a.out. Il risultato potrebbe essere: <P> <BLOCKQUOTE><CODE> <PRE> $ gcc -v Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2 </PRE> </CODE></BLOCKQUOTE> <P>Le cose da notare sono: <P> <DL> <DT><B>i486</B><DD><P>Indica che il gcc è stato compilato per un processore 486 - altre possibilità sono 386 o 586. Tutti i processori possono eseguire il codice compilato per ciascuna delle altre versioni; la differenza consiste nell'ottimizzazione che non ha effetti sulle prestazioni in un 386, ma rende il codice eseguibile leggermente più grande. <P> <DT><B>box</B><DD><P>Non è affatto importante, potrebbe esserci qualcosa di diverso (come <CODE>slackware</CODE> o <CODE>debian</CODE>) o anche nulla (in tal caso, il nome di directory completa sarà <CODE>i486-linux</CODE>). Se si esegue personalmente la compilazione di gcc, è possibile impostare questa caratteristica al momento della compilazione, a fini puramente estetici. <P> <DT><B>linux</B><DD><P>In alternativa, potrebbe essere <CODE>linuxelf</CODE> o <CODE>linuxaout</CODE>, il significato varia a seconda della versione utilizzata, fatto che potrebbe confondere le idee. <P> <DL> <DT><B>linux</B><DD><P>significa ELF se la versione è la 2.7.0 o seguente, altrimenti significa a.out. <P> <DT><B>linuxaout</B><DD><P>significa a.out. È stato introdotto quando la definizione di <CODE>linux</CODE> è stata modificata da a.out in ELF, in modo che non sia possibile vedere un gcc <CODE>linuxaout</CODE> più vecchio della versione 2.7.0. <P> <A NAME="index.15"></A> <DT><B>linuxelf</B><DD><P>è obsoleto. Si tratta generalmente di una versione di gcc 2.6.3 impostata per produrre eseguibili ELF. Si noti che il gcc 2.6.3 contiene degli errori nella produzione di codice per ELF - si consiglia un aggiornamento. </DL> <P> <DT><B>2.7.2</B><DD><P>numero della versione. </DL> <P>In conclusione, si tratta di gcc 2.7.2 che produce del codice ELF. <P> <H2><A NAME="ss3.2">3.2 Dov'è finito?</A> </H2> <P>Se gcc è stato installato senza prestare attenzione, oppure se è stato ottenuto come parte di una distribuzione, potrebbe essere necessario scoprire dove si trova all'interno del filesystem. Le parti chiave sono: <P> <UL> <LI> <CODE>/usr/lib/gcc-lib/</CODE><B>destinazione</B><CODE>/</CODE><B>versione</B><CODE>/</CODE> (e sottodirectory) posto in cui si trova la maggior parte del compilatore, i programmi eseguibili che effettuano la compilazione, alcune librerie e file include specifici per la versione che si sta utilizzando. </LI> <LI> <CODE>/usr/bin/gcc</CODE> driver del compilatore - la parte che si esegue dalla riga di comando. Può essere utilizzato con diverse versioni di gcc, a patto che siano state installate più directory di compilatore (come descritto sopra). Per scoprire la versione predefinita, digitare <CODE>gcc -v</CODE>. Per forzare un'altra versione, digitare <CODE>gcc -V</CODE> <B>versione</B>. Ad esempio: <BLOCKQUOTE><CODE> <PRE> # gcc -v Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2 # gcc -V 2.6.3 -v Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.6.3/specs gcc driver version 2.7.2 executing gcc version 2.6.3 </PRE> </CODE></BLOCKQUOTE> </LI> <LI> <CODE>/usr/</CODE><B>destinazione</B><CODE>/(bin|lib|include)/</CODE>. Se sono stati installati più destinazioni (target) (ad esempio, a.out ed elf, o un cross compilatore di qualche tipo), le librerie, le binutils (come <CODE>as</CODE>, <CODE>ld</CODE> o altri) e gli header file per destinazioni non native possono essere trovati in questa posizione. Se è stato installato un solo tipo di gcc, diverse parti di esso sono poste o in questa directory o, alternativamente, in <CODE>/usr/(bin|lib|include)</CODE>. </LI> <LI> <CODE>/lib/</CODE>, <CODE>/usr/lib</CODE> e altre sono directory di libreria per il sistema nativo. Sarà anche necessaria la directory <CODE>/lib/cpp</CODE> per molte applicazioni (ad esempio X ne fa un grande utilizzo) - è possibile copiarla da <CODE>/usr/lib/gcc-lib/destinazione/versione/</CODE> o creare un collegamento (link) simbolico. <A NAME="index.16"></A> </LI> </UL> <P> <H2><A NAME="index.17"></A> <A NAME="ss3.3">3.3 Dove si trovano gli header file?</A> </H2> <P>Indipendentemente dalla posizione in cui sono stati installati i propri, sotto <CODE>/usr/local/include</CODE>, esistono tre sorgenti principali degli header file in Linux: <P> <UL> <LI>la maggior parte di <CODE>/usr/include/</CODE> e relative subdirectory sono sostituiti con il pacchetto binario di libc da H. J. Lu. In tali posizioni si potrebbero anche trovare file da altri sorgenti (librerie <B>curses</B> e <B>dbm</B>, ad esempio) specialmente se si sta utilizzando la distribuzione libc più recente (che non contiene curses o dbm, come invece accadeva nelle più vecchie). <A NAME="index.18"></A> <A NAME="index.19"></A> </LI> <LI><CODE>/usr/include/linux</CODE> e <CODE>/usr/include/asm</CODE> (per i file <CODE><linux/*.h></CODE> e <CODE><asm/*.h></CODE>) dovrebbero essere link simbolici alle directory <CODE>linux/include/linux</CODE> e <CODE>linux/include/asm</CODE> nella distribuzione sorgente del kernel. È necessario installarli se si pensa di eseguire lo sviluppo di un qualsiasi programma non banale; non servono solo per la compilazione del kernel. <P>Potrebbe essere anche necessario eseguire il <CODE>make config</CODE> nelle directory del kernel dopo aver scaricato i sorgenti. Molti file dipendono da <CODE><linux/autoconf.h></CODE> che potrebbe non esistere, e in alcune versioni di kernel, <CODE>asm</CODE> è un link simbolico che viene creato al momento del <CODE>make config</CODE>. Pertanto, se si scaricano i sorgenti del kernel sotto <CODE>/usr/src/linux</CODE>: <P> <BLOCKQUOTE><CODE> <PRE> $ cd /usr/src/linux $ su # make config [rispondere alle domande. A meno che non si abbia intenzione di proseguire con la compilazione del kernel, la risposta non ha molta importanza] # cd /usr/include # ln -s ../src/linux/include/linux . # ln -s ../src/linux/include/asm . </PRE> </CODE></BLOCKQUOTE> <P> <A NAME="index.20"></A> <A NAME="index.21"></A> <A NAME="index.22"></A> <A NAME="index.23"></A> <A NAME="index.24"></A> <P> </LI> <LI>File come <CODE><float.h></CODE>, <CODE><limits.h></CODE>, <CODE><varargs.h></CODE>, <CODE><stdarg.h></CODE> e <CODE><stddef.h></CODE> variano a seconda della versione del compilatore, pertanto si trovano in <CODE>/usr/lib/gcc-lib/i486-box-linux/2.7.2/include/</CODE> e posizioni simili. </LI> </UL> <P> <H2><A NAME="ss3.4">3.4 Compilazione di cross compilatori</A> </H2> <H3>Linux come piattaforma di destinazione</H3> <P>Supponendo di aver ottenuto il codice sorgente per gcc, solitamente è sufficiente seguire le istruzioni contenute nel file <CODE>INSTALL</CODE> di GCC. Un comando <CODE>configure -target=i486-linux -host=XXX</CODE> sulla piattaforma <CODE>XXX</CODE> seguito da un <CODE>make</CODE> dovrebbe funzionare. Si noti che saranno necessari gli include di Linux, gli include del kernel e sarà necessario eseguire anche la compilazione del cross assembler e del cross linker dai sorgenti in <A HREF="ftp://tsx-11.mit.edu/pub/linux/packages/GCC/">ftp://tsx-11.mit.edu/pub/linux/packages/GCC/</A>. <P> <H3>Linux come piattaforma sorgente, MSDOS come destinazione</H3> <P>Apparentemente dovrebbe essere possibile utilizzando il pacchetto "emx" o l'extender "go". Si invita a dare un'occhiata a <A HREF="ftp://sunsite.unc.edu/pub/Linux/devel/msdos">ftp://sunsite.unc.edu/pub/Linux/devel/msdos</A>. <P>L'autore, non ha ancora verificato le funzionalità e pertanto non può dare alcuna garanzia in merito. <P> <HR> <A HREF="GCC-HOWTO-4.html">Avanti</A> <A HREF="GCC-HOWTO-2.html">Indietro</A> <A HREF="GCC-HOWTO.html#toc3">Indice</A> </BODY> </HTML>