在shell的提示符號下鍵入gcc -v
,螢幕上就會顯示出你目前正在使用的GCC的版本。同時這也是一個相當可靠的方法,可以確定你現在所用的是ELF或是a.out。在我的系統上,執行gcc -v的結果是:
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
上面的訊息指出了幾件重要的事情:
i486
這是指明你現在正在用的gcc是為了486的微處理器而寫的---你的電腦可能是386或是586。這3種微處理器的晶片所編譯而成的程式碼,彼此間是可以相容使用的。差別之處是486的程式碼在某些地方有加上padding的功能,所以可以在486上面跑得比較快。這對386的機器而言,執行程式的效能並不會有什麼不良的影響,只不過真的會讓程式碼變得稍稍的大了一些。
box
這可以說一點也不重要;不過也可能另有所指(像是slackware
或者是debian
),或者根本什麼也不是(所以囉!完整的目錄名稱是i486-linux
)。假如你是實務派的佼佼者,親自動手建立屬於自己的gcc,那麼你可以在建立的過程中設定這一項,以裝點門面。就像我做的一樣:-)
。
linux
其實這是指linuxelf
或是linuxaout
。這一項會令人引起不必要的困惑,究竟是指哪一種會根據你所用的版本而異。
2.7.2
版本的序號。所以,總結起來,我有2.7.2版的gcc,可以產生ELF格式的程式碼。就這麼簡單,驚訝吧!eh?
如果安裝gcc時沒有仔細的看著螢幕,或者你是從一個完整的發行系統裡把gcc單獨抓出來安裝的話,那麼也許你會想知道到底這些東東裝好後是住在整個檔案系統的那些地方。幾個重點如下:
/usr/lib/gcc-lib/
target/
version/
(與子目錄)大部份的編譯器就是住在這個地方的。在這兒有可執行的程式,實際在做編譯的工作;另外,還有一些特定版本的程式庫與標頭檔等也會儲存在此。
/usr/bin/gcc
指的是編譯器的驅動程式---也就是你實際在命令列(command line)上執行的程式。這個目錄可供各種版本的gcc使用,只要你用不同的編譯器目錄(如上所述)來安裝就可以了。要知道內定的版本是那一個,在shell提示符號下打gcc -v
。要是想強迫執行某個版本,就換打gcc -V
version。例如:
# 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/
target/(bin|lib|include)/
如果你裝了數種的目標物件,例如a.out與elf,或是某一種的交叉編譯器(cross-compiler)等等,那些屬於非主流目標物件(non-native target(s))的程式庫,binutils(as
、ld
等等)工具與標頭檔等都可以在這兒找到。即使你只安裝了一種gcc,還是可以在這兒找到這些原本就是替它們準備的東東。如果不是在這兒,那麼就應該是在/usr/(bin|lib|include)
了。
/lib/
,/usr/lib
與其它的目錄等都是主流系統(native-system)的程式館目錄。許多的應用程式都會用到/lib/cpp
,因此你也需要它---作法上,不是從/usr/lib/gcc-lib/
target/
version/
目錄裡拷貝,就是弄個符號連結(symlink)指向那兒。
[譯者註:所謂的native,是指目前你的系統是以a.out或elf的格式為主,或者內定的gcc是哪一種版本等等。native的意思是‘本土的’、‘本國的’與‘天生的’……等等;當你拿到一片CD-ROM重頭至尾將Linux安裝完成,讓Linux出生,成為你個人特色濃厚的作業平台後,如果再加裝一些不一樣的目標物件,自然就有‘本土’與‘外省’﹙ 無關政治﹚,‘本國’與‘外國’、‘天生’與‘人為’等等的區別,同時也含有內定(default)的意思在。假若再附加上你個人的價值觀判斷和喜好,我想用主流(native)與非主流(non-native)來翻譯應該還算恰當。]
假如把你自行安裝在/usr/local/include
目錄底下的標頭檔排除在外的話,Linux還有另外3種主要的標頭檔:
/usr/include/
與其子目錄底下的標頭檔,大部份都是由H.J.Lu發展的libc套件(libc binary package)所提供的。我會只說‘大部份’的原因,是因為你可能有其它來源的標頭檔(像是curses
與dbm
程式庫等等)擺在這兒;尤其是,如果你現在用的是最新的libc發行系統的話(新版本不像舊版那樣,已經不再支援curses或dbm了。),那東東之多是人人為之咋舌的!
[譯者註:libc binary package意指以二進位形式(machine code)儲存之套件,並非原始碼(text),若要以中文全稱譯出,則成‘libc二進位檔套件’,似有聱牙之嫌,故略去binary,以libc套件通稱。]
/usr/include/linux
與 /usr/include/asm
(裡頭有這些檔案:<linux/*.h>
與 <asm/*.h>
)應該有符號連結(symbolic links)可以連結至目錄linux/include/linux
與 linux/include/asm
。如果你有鴻鵠之志的話,安裝這些東東後,就不應該只是拿來編譯核心(kernel)而已。
把原始碼解壓縮(unpacking)後,可能你也會發現,需要在核心的目錄(kernel directory)底下做make config
的動作。很多的檔案都會依賴<linux/autoconf.h>
的幫忙,可是這個檔案卻有可能因版本不同而不存在。若干核心版本裡,asm
就只是它自己的一個符號連結,僅僅是在make config
時才建立出來而已。
[譯者註:原文提及autoconf.h時是‘Many files depend on <linux/autoconf.h>
,which otherwise may not exist,*’。此處之otherwise之詞性應為形容詞(adj),指‘另一情況’、‘另一種’、‘不同的’之意,將原文形容詞子句拆開來應為:(i) Many files depend on <linux/autoconf.h>
.
(ii)<linux/autoconf.h>
of other condition may not exist.
與下一句互相比對,此處應同指在不同版本之情況下。]
所以,當你在目錄/usr/src/linux
底下,解開核心的程式碼時,就照著下面指示的做吧!
$ cd /usr/src/linux
$ su
# make config
(回答接下來的問題。通常回答得正不正確並不重要,除非你打算繼續築造核心。)
# cd /usr/include
# ln -s ../src/linux/include/linux .
# ln -s ../src/linux/include/asm .
<float.h>
、<limits.h>
、<varargs.h>
、<stdarg.h>
與<stddef.h>
之類的檔案,會隨著不同的編譯器版本而異,屬於你‘個人的’檔案,可以在 /usr/lib/gcc-lib/i486-box-linux/2.7.2/include/
與其它相類似(相同)的目錄名稱的地方找到。
11/11/97譯
5/14/98修正
假設你已經拿到gcc的原始碼,通常你只要依循INSTALL檔的指示便可完成一切的設定。 make後面再接configure --target=i486-linux --host=XXX
on platform XXX
,就能幫你變把戲了。要注意的是,你會需要Linux還有核心的標頭檔;同時也需要建立交叉組譯器(cross assembler)與交叉連結器(cross linker),來源是
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/。
Ugh。很明顯的,這個大概需要用到套件“emx”或是延伸套件“go”。請自行去 ftp://sunsite.unc.edu/pub/Linux/devel/msdos看看。我並沒有測試過這些個東西,所以沒有辦法保證什麼。