星期二, 9月 29, 2009

外行人編譯GCC

因為手上有某台很舊的伺服器,想要在上面編譯某個程式執行,無奈GCC版本是2.96編不過,於是興起自己編譯gcc的念頭。原本還想更新GLIBC,看了一下Glibc 2 HOWTO 中文版使用源代码将 Glibc 升级到 2.6就暫時打消念頭。


首先必須自己抓automake、autoconf、make、libtool等等的source 回來更新,這是因為手上的Linux版本太舊,早已沒有人維護套件。
我比較狠,都是解開後
./configure --prefix=/usr && make && sudo make install
直接蓋掉原來的程式,心臟不夠大顆或沒有備份千萬別這麼幹。

編譯GCC還需要GMPMPFRMPC
若是在Mac OS利用ports可安裝上述套件;若用Homebrew裝MPC似乎是版本未更新,所以得手動下載新版,得注意。

我原本沒有仔細看文件就硬編,所以才會在autoconf時遇到上面那些套件太舊的問題。再來一定要好好看Installing GCC這份官方文件,不會太長。GCC有一點和平常編譯套件不同,GCC不建議在原始程式目錄下編譯,測試過確實會干擾,必須要在另一個目錄編譯才不會發生錯誤。我的步驟如下:(註:NTU似乎更新有問題,所以我改用twaren的mirror)
wget http://ftp.twaren.net/Unix/GNU/gnu/gcc/gcc-4.7.0/gcc-4.7.0.tar.gz
tar xzf gcc-4.7.0.tar.gz
mkdir gccbuild && cd gccbuild
../gcc-4.7.0/configure --prefix=/usr
make BOOT_CFLAGS='-O' bootstrap
sudo make install
這樣太危險應該要先用make DESTDIR=path-to-rootdir install確認一切正常再用sudo make install覆蓋原來的GCC,這裏的path-to-rootdir要用絕對路徑,不能用相對路徑。

裝完後So far so good,但不知何時會踩到地雷,好孩子千萬別這麼幹呀 ^_^

註:用這麼新的GCC有些Warning視同Error,例如 strict-aliasing rules,可以在configure套件時用configure  --disable-werror避開,這樣編譯Binutils等套件才能順利編譯。

1 則留言:

Allex Juang 提到...

哇.. Glibc2 HOWTO 是我好幾年前一時興起翻的
沒想到現在竟然派上用場
真是令人高興

至於 gcc 的編譯 其實沒什麼好擔心的
記得 make 的過程中
gcc 會用編出來的 gcc 再對自己編譯一次
只有編譯成功才算 make 成功
所以就放心的用吧