290
汽車大全
《Linux From Scratch》第二部分:準備構建 第五章:構建臨時文件係統- 5.5. GCC-4.9.2 - 第一遍
GCC 軟件包是 GNU 編譯器集合的一部分,其中包括 C 和 C++ 的編譯器。
5.5.1. 安裝交叉編譯的 GCC
現在 GCC 需要 GMP、 MPFR 和 MPC 軟件包。在你的主機發行版中可能並不包括這些軟件包,它們將和 GCC 一起編譯。解壓每個軟件包到 GCC 源文件夾並重命名解壓後的文件夾,以便 GCC 編譯過程中能自動使用這些軟件:
tar -xf ../mpfr-3.1.2.tar.xz mv -v mpfr-3.1.2 mpfr tar -xf ../gmp-6.0.0a.tar.xz mv -v gmp-6.0.0 gmp tar -xf ../mpc-1.0.2.tar.gz mv -v mpc-1.0.2 mpc
下麵的指令將會修改 GCC 默認的動態鏈接器為安裝在 /tools
文件夾中的。它也會從 GCC 的 include
搜索路徑中移除 /usr/include
。執行:
for file in \ $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h) do cp -uv $file{,.orig} sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ -e 's@/usr@/tools@g' $file.orig > $file echo ' #undef STANDARD_STARTFILE_PREFIX_1 #undef STANDARD_STARTFILE_PREFIX_2 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file touch $file.orig done
如果上麵的看起來難以理解,讓我們分開來看一下吧。首先我們找到 gcc/config
文件夾下的所有命名為
linux.h
, linux64.h
或 sysv4.h
的文件。對於找到的每個文件,我們把它複製到相同名稱的文件,但增加了後綴
“.orig”。然後第一個
sed 表達式在每個 “/lib/ld”, “/lib64/ld”
或 “/lib32/ld” 實例前麵增加“/tools”,第二個
sed 表達式替換 “/usr” 的硬編碼實例。然後,我們添加這改變默認
startfile 前綴到文件末尾的定義語句。注意 “/tools/lib/” 後麵的 “/” 是必須的。最後,我們用
touch 更新複製文件的時間戳。當與
cp -u 一起使用時,可以防止命令被無意中運行兩次造成對原始文件意外的更改。
GCC 不能正確檢測棧保護,這會導致編譯 Glibc-2.21 時出現問題,用下麵的命令修複這個問題:
sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure
GCC 手冊建議在源文件夾之外一個專門的編譯文件夾中編譯 GCC:
mkdir -v ../gcc-build cd ../gcc-build
準備編譯 GCC:
../gcc-4.9.2/configure \ --target=$LFS_TGT \ --prefix=/tools \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --with-local-prefix=/tools \ --with-native-system-header-dir=/tools/include \ --disable-nls \ --disable-shared \ --disable-multilib \ --disable-decimal-float \ --disable-threads \ --disable-libatomic \ --disable-libgomp \ --disable-libitm \ --disable-libquadmath \ --disable-libsanitizer \ --disable-libssp \ --disable-libvtv \ --disable-libcilkrts \ --disable-libstdc++-v3 \ --enable-languages=c,c++
配置選項的含義:
-
--with-newlib
-
由於還沒有可用的 C 庫,這確保編譯 libgcc 時定義了常數 inhibit_libc。這可以防止編譯任何需要 libc 支持的代碼。
-
--without-headers
-
創建一個完成的交叉編譯器的時候,GCC 要求標準頭文件和目標係統兼容。對於我們的目的來說,不需要這些頭文件。這個選項可以防止 GCC 查找它們。
-
--with-local-prefix=/tools
-
GCC 會查找本地已安裝的 include 文件的係統位置。默認是
/usr/local
。把它設置為/tools
能把主機位置中的/usr/local
從 GCC 的搜索路徑中排除。 -
--with-native-system-header-dir=/tools/include
-
GCC 默認會在
/usr/include
中查找係統頭文件。和 sysroot 選項一起使用,會轉換為$LFS/usr/include
。在後麵兩個章節中頭文件會被安裝到$LFS/tools/include
。這個選項確保 gcc 能正確找到它們。第二次編譯 GCC 時,同樣的選項可以保證不會去尋找主機係統的頭文件。 -
--disable-shared
-
這個選項強製 GCC 靜態鏈接到它的內部庫。我們這樣做是為了避免與主機係統可能出現的問題。
-
--disable-decimal-float, --disable-threads, --disable-libatomic, --disable-libgomp, --disable-libitm, --disable-libquadmath, --disable-libsanitizer, --disable-libssp, --disable-libvtv, --disable-libcilkrts, --disable-libstdc++-v3
-
這些選項取消了對十進製浮點數擴展、線程化、libatomic、 libgomp、 libitm、 libquadmath、 libsanitizer、 libssp、 libvtv、 libcilkrts 和 C++ 標準庫的支持。這些功能在編譯交叉編譯器的時候會導致編譯失敗,對於交叉編譯 臨時 libc 來說也沒有必要。
-
--disable-multilib
-
在 x86_64 機器上, LFS 還不支持 multilib 配置。這個選項對 x86 來說無害。
-
--enable-languages=c,c++
-
這個選項確保隻編譯 C 和 C++ 編譯器。這些是現在唯一需要的語言。
運行命令編譯 GCC:
make
現在編譯完成了。在這裏,通常會運行測試套件,但正如前麵提到的,測試套件框架還沒有準備好。在此進行測試的並沒有太多好處,因為第一遍編譯的程序很快會被取代。
安裝軟件包:
make install
該軟件包的詳細信息在 Section 6.17.2, “GCC 軟件包內容”。
創建者:Gerard Beekmans
編輯者:Matthew Burgess 和 Armin K.
翻譯團隊:LCTT
譯者/校對:ictlyh,dongfengweixiao,
最後更新:2017-11-07 14:34:46