È possibile scoprire quale versione GCC si sta eseguendo digitando
gcc -v
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:
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
Le cose da notare sono:
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.
Non è affatto importante, potrebbe esserci qualcosa di
diverso (come slackware
o debian
) o anche nulla (in tal caso, il
nome di directory completa sarà i486-linux
). Se si esegue
personalmente la compilazione di gcc, è possibile impostare questa
caratteristica al momento della compilazione, a fini puramente estetici.
In alternativa, potrebbe essere linuxelf
o linuxaout
, il significato varia a seconda della versione
utilizzata, fatto che potrebbe confondere le idee.
significa ELF se la versione è la 2.7.0 o seguente, altrimenti significa a.out.
significa a.out. È stato introdotto quando la definizione
di linux
è stata modificata da a.out in ELF, in modo che non sia
possibile vedere un gcc linuxaout
più vecchio della versione
2.7.0.
è 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.
numero della versione.
In conclusione, si tratta di gcc 2.7.2 che produce del codice ELF.
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:
/usr/lib/gcc-lib/
destinazione/
versione/
(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.
/usr/bin/gcc
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
gcc -v
. Per forzare un'altra versione, digitare gcc -V
versione. Ad esempio:
# 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
/usr/
destinazione/(bin|lib|include)/
. 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 as
,
ld
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 /usr/(bin|lib|include)
.
/lib/
, /usr/lib
e altre sono directory di libreria per
il sistema nativo. Sarà anche necessaria la directory /lib/cpp
per molte applicazioni (ad esempio X ne fa un grande utilizzo) - è
possibile copiarla da /usr/lib/gcc-lib/destinazione/versione/
o creare un collegamento (link) simbolico.
Indipendentemente dalla posizione in cui sono stati installati i propri,
sotto /usr/local/include
, esistono tre sorgenti principali degli
header file in Linux:
/usr/include/
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 curses e dbm, ad esempio) specialmente se si sta
utilizzando la distribuzione libc più recente (che non contiene curses o
dbm, come invece accadeva nelle più vecchie).
/usr/include/linux
e /usr/include/asm
(per i file
<linux/*.h>
e <asm/*.h>
) dovrebbero essere
link simbolici alle directory linux/include/linux
e
linux/include/asm
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.
Potrebbe essere anche necessario eseguire il make config
nelle
directory del kernel dopo aver scaricato i sorgenti. Molti
file dipendono da <linux/autoconf.h>
che potrebbe non
esistere, e in alcune versioni di kernel, asm
è un link
simbolico che viene creato al momento del make config
. Pertanto, se
si scaricano i sorgenti del kernel sotto /usr/src/linux
:
$ 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 .
<float.h>
, <limits.h>
,
<varargs.h>
, <stdarg.h>
e
<stddef.h>
variano a seconda della versione del compilatore,
pertanto si trovano in
/usr/lib/gcc-lib/i486-box-linux/2.7.2/include/
e posizioni simili.
Supponendo di aver ottenuto il codice sorgente per gcc, solitamente è
sufficiente seguire le istruzioni contenute nel file INSTALL
di GCC. Un comando configure -target=i486-linux -host=XXX
sulla piattaforma XXX
seguito da un make
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
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/.
Apparentemente dovrebbe essere possibile utilizzando il pacchetto "emx" o l'extender "go". Si invita a dare un'occhiata a ftp://sunsite.unc.edu/pub/Linux/devel/msdos.
L'autore, non ha ancora verificato le funzionalità e pertanto non può dare alcuna garanzia in merito.