閱讀290 返回首頁    go 汽車大全


《Linux From Scratch》第二部分:準備構建 第五章:構建臨時文件係統- 5.5. GCC-4.9.2 - 第一遍

             GCC 軟件包是 GNU 編譯器集合的一部分,其中包括 C 和 C++ 的編譯器。

大概編譯時間: 5.9 SBU
所需磁盤空間: 2.0 GB

5.5.1. 安裝交叉編譯的 GCC

現在 GCC 需要 GMP、 MPFR 和 MPC 軟件包。在你的主機發行版中可能並不包括這些軟件包,它們將和 GCC 一起編譯。解壓每個軟件包到 GCC 源文件夾並重命名解壓後的文件夾,以便 GCC 編譯過程中能自動使用這些軟件:

[Note]

注意

有些讀者對本章節內容存在誤解。和之前章節中介紹的(軟件包編譯指南)一樣,過程都是相同的。首先從源文件夾中解壓 gcc tar 包 然後進入到創建的文件夾中。然後才可以執行下麵的指令。

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.hsysv4.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

  上一篇:go  《Linux From Scratch》第二部分:準備構建 第五章:構建臨時文件係統- 5.6. Linux-3.19 API 頭文件
  下一篇:go  《Linux From Scratch》第二部分:準備構建 第五章:構建臨時文件係統- 5.4. Binutils-2.25 - 第一遍