1. 程式人生 > >超簡單!!centos 6離線原始碼編譯安裝升級gcc、binutils、automake、autoconf

超簡單!!centos 6離線原始碼編譯安裝升級gcc、binutils、automake、autoconf

centos 6系列的Linux發行版,是非常成功(具足UNIX精神)的發行版,可能大家都已經用得非常習慣了。
但問題是,其核心及附帶的工具軟體,版本卻都非常老了。
centos 7上的軟體版本雖然比較新,但centos 7設計風格的突變(主要是引入了很不符合UNIX精神的systemd),可能在業界也引起了不少爭議。
而我們苦逼的開發者,可能面臨既需要使用高版本的相關元件,又不想升級到centos 7的困境。
那就升級centos 6上的核心與工具吧。
升級核心還算好辦,因為核心對編譯環境的要求很低。不熟悉核心升級的朋友,可以參考如下博文。
http://blog.csdn.net/crazycoder8848/article/details/44131735


但是升級gcc等工具,如果不熟悉情況的話,可能就不順利了。
公司研發環境上網的不便,centos 6環境下各種高版本rpm軟體包的缺失,都會給升級帶來麻煩。
本文提供的離線原始碼升級方法,就非常適合解決上述難題。


這裡順便說明一下,本文的標題雖然帶了離線二字,但並不表示本人沒有通過Linux主機下載相關檔案。
本文為了操作及行文的方便,可能有多處會用wget去下載相關軟體包或指示下載行為。
只所以帶離線二字,是因為本文提供的方法非常適用於離線操作。
最後,由於本文的升級全部是基於原始碼編譯安裝,與具體的包管理系統(如rpm、apt等)無關。
因此,本文的方法應該也適用於其他Linux發行版(如ubuntu等)。


先來看看筆者的Linux主機升級前的情況:

[[email protected] ~]# cat  /etc/redhat-release 
CentOS release 6.5 (Final)
[[email protected] ~]# uname -a
Linux localhost.localdomain 2.6.32-431.el6.i686 
#1 SMP Fri Nov 22 00:26:36 UTC 2013 i686 i686 i386 GNU/Linux
[[email protected] ~]# gcc  --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
[

[email protected] ~]# autoconf --version
autoconf (GNU Autoconf) 2.63
[[email protected] ~]# automake  --version
automake (GNU automake) 1.11.1


gnu binutils包含as、ld、objdump等工具。從下面的輸了資訊來看,相關工具的版本號,就是binutils的版本號。

[[email protected] ~]# rpm -qa binutils
binutils-2.20.51.0.2-5.36.el6.i686
[[email protected] ~]# as --version
GNU assembler version 2.20.51.0.2-5.36.el6 20100205
[[email protected] ~]# ld --version
GNU ld version 2.20.51.0.2-5.36.el6 20100205
[[email protected] ~]# objdump -v
GNU objdump version 2.20.51.0.2-5.36.el6 20100205

為什麼要升級binutils呢?因為我們熟悉的編譯工具gcc自己只能將C程式碼編譯為以.s結尾的文字形式的彙編檔案。

而.s到.o的過程,則需要由as來完成。而as屬於gnu binutils軟體包。因此,如果不升級binutils,可能會出現這種情況:

gcc按照新款cpu的特點編譯 C程式碼,生成的.s檔案中含有較新的指令,例如avx2指令(新款x86系列cpu的加速指令)。

而老版的as程式卻不認識此指令,結果導致編譯失敗。另外,像objdump反彙編二進位制檔案時,也同樣可能出現某些指令不能識別的問題。

好了,下面看看相關工具的升級過程吧。

先來升級gcc吧。

//建立一個乾淨的目錄,用於下載及升級諸工具
[[email protected] ~]# mkdir  tools_update  
[[email protected] ~]# cd     tools_update/  
[[email protected] tools_update]# wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.2/gcc-4.8.2.tar.bz2  
[[email protected] tools_update]# wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2  
[[email protected] tools_update]# wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2  
[[email protected] tools_update]# wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz  
//接下來為gcc的編譯做些準備。  
//注意,我們這裡不用自己去編譯上面下載的3個庫。  
//我們參考gcc-4.8.2/contrib/download_prerequisites中的方法,  
//讓gcc的編譯指令碼自動幫我們配置並編譯這3個庫。  
//具體步驟如下:
[[email protected] tools_update]# tar -xjf gcc-4.8.2.tar.bz2   
[[email protected] tools_update]# cd gcc-4.8.2  
[[email protected] gcc-4.8.2]# tar  -xjf  ../mpfr-2.4.2.tar.bz2  
[[email protected] gcc-4.8.2]# ln   -sf mpfr-2.4.2 mpfr  
[[email protected] gcc-4.8.2]# tar  -xjf ../gmp-4.3.2.tar.bz2  
[[email protected] gcc-4.8.2]# ln   -sf gmp-4.3.2 gmp  
[[email protected] gcc-4.8.2]# tar  -xzf ../mpc-1.0.3.tar.gz  
[[email protected] gcc-4.8.2]# ln   -sf mpc-1.0.3 mpc  
  
//好了,現在開始配置gcc了。注意,配置命令中的--prefix=/usr的設定很重要。  
//因為這樣設定,在後面make install時可以直接覆蓋老的gcc,安裝後就不用再額外設定其他東西了。
//我們後面其他工具的編譯安裝,也都採用此設定。這樣最簡單。
[[email protected] gcc-4.8.2]# ./configure  --prefix=/usr  --enable-languages=c,c++ --enable--long-long --enable-threads=posix --disable-checking --disable-multilib
//下面開始編譯gcc了。注意,這個編譯過程超級漫長。
[[email protected] gcc-4.8.2]# make  
[[email protected] gcc-4.8.2]# make install  
//好了,看看升級結果吧^_^  
[[email protected] gcc-4.8.2]# gcc --version  
gcc (GCC) 4.8.2


//然後升級binutils,畢竟這和基礎的構建功能是強相關的。
[[email protected] tools_update]# wget http://ftp.gnu.org/gnu/binutils/binutils-2.25.1.tar.bz2  
[[email protected] tools_update]# tar -xjf binutils-2.25.1.tar.bz2   
[[email protected] tools_update]# cd binutils-2.25.1  
[[email protected] binutils-2.25.1]# ./configure  --prefix=/usr  
[[email protected] binutils-2.25.1]# make  
[[email protected] binutils-2.25.1]# make install  
//好了,看看結果吧^_^
[[email protected] binutils-2.25.1]# as --version  
GNU assembler (GNU Binutils) 2.25.1  
[[email protected] binutils-2.25.1]# objdump -v  
GNU objdump (GNU Binutils) 2.25.1  
[[email protected] binutils-2.25.1]# ld -v  
GNU ld (GNU Binutils) 2.25.1  


//接下來升級其他工具。注意,請保持順序與本文一致。否則可能會失敗。
[[email protected] automake-1.14.1]# wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.xz  
[[email protected] tools_update]# tar -xJf autoconf-2.68.tar.xz   
[[email protected] tools_update]# cd autoconf-2.68  
[[email protected] autoconf-2.68]# ./configure --prefix=/usr  
[[email protected] autoconf-2.68]# make  
[[email protected] autoconf-2.68]# make install  
  
[[email protected] tools_update]# wget http://ftp.gnu.org/gnu/automake/automake-1.14.1.tar.xz  
[[email protected] tools_update]# tar -xJf automake-1.14.1.tar.xz   
[[email protected] tools_update]# cd automake-1.14.1  
[[email protected] automake-1.14.1]# ./configure --prefix=/usr  
[[email protected] automake-1.14.1]# make  
[[email protected] automake-1.14.1]# make install  
//好了,看看結果吧^_^
[[email protected] automake-1.14.1]# autoconf  --version  
autoconf (GNU Autoconf) 2.68  
[[email protected] automake-1.14.1]# automake --version  
automake (GNU automake) 1.14.1  


 

不過有時候,版本高了,也會帶來額外的麻煩。

像binutils,從2.22版本開始,在連結生成可執行程式時,不會自動的隱式連結所需的庫,而是需要明確的指定連結什麼庫。

結果這導致編譯核心時,執行make menuconfig失敗。

不過,解決辦法是有的。

按照上文介紹的方法,編譯安裝一個2.21版的binutils即可。

以後想切到哪個版本了,直接進入原始碼目錄執行一下make install即可。
 

轉載至https://blog.csdn.net/crazycoder8848/article/details/53843461