重走LFS之路:(四) 工具鏈編譯-1
經過了充分的準備工作之後,我們要來著手工具鏈的編譯。LFS不能直接使用宿主系統的編譯器和庫進行編譯,而是用宿主系統的編譯器和庫再編譯出來一份編譯器和庫,然後二次編譯編譯器和庫,最後才能用最終的編譯器來編譯構建LFS系統。所以我們現在需要做的是來編譯這些工具。
(題圖來自: techradar.com)
這些工具的編譯比較冗長,所以可能需要數篇的篇幅來記錄這些過程。
首先需要建立一個目錄來安置這些工具
mkdir -v $LFS/tools
然後為了方便,我們在根目錄做了個軟連線 /tools -> $LFS/tools
sudo ln -sv $LFS/tools /tools
這時候有個坑,LFS 7.7官方文件上寫的命令是ln -sv $LFS/tools /,但是事實上在Debian 7.7版本實測,醬紫可能會有問題,就像這樣
接下來為了避免使用許可權大的賬號誤操作造成宿主機損失,新建一個lfs賬戶,加入lfs組,並且將$LFS下的src和tools兩個目錄屬主都改為lfs。
sudo groupadd lfs
sudo useradd -s /bin/bash -g lfs -m -k /dev/null lfs
sudo passwd lfs
sudo chown -v lfs $LFS/tools
sudo chown -Rv lfs $LFS/src
這裡還有一個坑,LFS 7.7官方文件上的原命令是chown -v lfs $LFS/src,可是我們已經下載完的檔案都在那裡面,會沒許可權操作的,所以需要加上R引數來遞迴修改檔案屬主。最後用su – lfs就可以切換到lfs賬戶來操作啦。
切換到lfs賬戶之後,我們需要建立這個賬戶的環境變數
vi ~/.bashrc
我們來寫一個環境變數檔案
HOME=$HOME
TERM=$TERM
PS1=’${debian_chroot:+($debian_chroot)}\[\033[01;31m\][\A]\[\033[01;33m\]\u\[\033[00m\]@\[\033[01;32m\]\h:\[\033[01;34m\]\w\[\033[00m\]$ ‘
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
然後載入這個環境變數檔案,並且檢視一下是不是真的將環境變數都設定上了
source ~/.bashrc
export
事實證明我們的操作是有效的呃……
此時是有一個編譯選項的,我起的虛擬機器是單核的就無所謂了。如果你用了多核機器來做LFS,那麼可以透過-j2引數來加速make,或者設定這樣一個環境變數
export MAKEFLAGS=’-j 2′
現在為了讓目錄簡單一點,我們需要把原始碼包從$LFS/src/lfs裡面挪到$LFS/src裡面
mv $LFS/src/lfs/* $LFS/src/
接下來我們進行工具編譯
首先調整當前路徑到$LFS/src
cd $LFS/src
解壓binutils,開始進行binutils的第一遍編譯
tar jxvf binutils-2.25.tar.bz2
進入binutils原始碼目錄
cd binutils-2.25
我們為了保持原始碼目錄的潔淨和區分編譯檔案,會將每個軟體新建一個構建目錄來配置和編譯,而非從原始碼目錄直接編譯,格式如{softname}-build
從$LFS/src/binutils-2.25平級建立binutils構建目錄並進入該目錄
mkdir -v ../binutils-build
cd ../binutils-build/
加入編譯選項來配置binutils
../binutils-2.25/configure \
–prefix=/tools \
–with-sysroot=$LFS \
–with-lib-path=/tools/lib \
–target=$LFS_TGT \
–disable-nls \
–disable-werror
編譯好的binutils不著急直接安裝,因為根據官方文件的提示,我們的機器架構是x86_64,此時需要建立個庫目錄,然後做個軟連線
case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
建立完成之後,就可以安裝啦
make install
回到$LFS/src目錄,繼續來解壓並第一遍編譯GCC,不過GCC稍微複雜一點,因為它需要三個包的支援,GMP, MPFR和MPC。
tar jxvf gcc-4.9.2.tar.bz2
cd gcc-4.9.2
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
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
sed -i ‘/k prot/agcc_cv_libc_provides_ssp=yes’ gcc/configure
準備完畢,下面依舊建立構建目錄,並且開始配置和構建
mkdir -v ../gcc-build
cd ../gcc-build
../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++
make
make install
除了三個支援包和前置的一些設定之外,gcc編譯就沒啥新鮮的了,編譯安裝就是了。
接下來繼續回到$LFS/src解壓和編譯安裝Linux API Headers
tar -xf linux-3.19.tar.xz
cd linux-3.19
make mrproper
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
Linux API Headers安裝完成
這裡有意思的是mrproper,其實和make clean的功能差不多,但是比clean的範圍要大。
相關文章
- 重走LFS之路:(五) 工具鏈編譯-2編譯
- 重走LFS之路:(六) 工具鏈編譯-3編譯
- 重走LFS之路:(八) 基礎系統編譯-1編譯
- 重走LFS之路:(九) 基礎系統編譯-2編譯
- 重走LFS之路:(七) 基礎系統編譯準備編譯
- 重走LFS之路:(二) 儲存裝置準備
- 重走LFS之路:(三) 磁碟初始化與原始碼準備原始碼
- 重走JAVA之路(一):覆盤ButterKnife-編譯時註解Java編譯
- ubuntu下編譯交叉編譯工具鏈Ubuntu編譯
- 重走JS之路JS
- Go 編譯和工具鏈Go編譯
- linux LFS 編譯成功記錄Linux編譯
- 製作交叉編譯工具鏈概述編譯
- 交叉編譯工具鏈構建原理編譯
- 全網可用交叉編譯工具鏈大全編譯
- 重走機器學習之路——形而上者謂之道機器學習
- 重走JAVA程式設計之路(三)反射Java程式設計反射
- OpenJFX編譯填坑之路編譯
- N1064編譯鏈編譯編譯
- 重走JAVA程式設計之路(一)列舉Java程式設計
- 重走JAVA程式設計之路(二)註解Java程式設計
- 開源編譯工具和編譯軟體編譯
- webpack 應用編譯優化之路Web編譯優化
- Android NDK 提供的交叉工具鏈手動編譯原始碼Android編譯原始碼
- java反編譯工具Java編譯
- CMake for Mac編譯工具Mac編譯
- 分散式編譯工具分散式編譯
- Android反編譯:反編譯工具和方法Android編譯
- RxJS學習之路四(Operators(1))JS
- js預編譯 --預編譯詳解四部曲JS編譯
- .net反編譯工具ILSpy編譯
- C語言編譯工具C語言編譯
- Centos7安裝(四)抓包工具wireshark原始碼編譯安裝CentOS原始碼編譯
- 【工利其器】工具使用之(四)systrace篇(1)官網翻譯
- Linux中gcc編譯工具LinuxGC編譯
- 我的彙編學習之路(1):指令
- [.NET大牛之路 006] 瞭解 Roslyn 編譯器ROS編譯
- 0909 編譯原理1編譯原理