Linux.中国 - 开源社区

 找回密码
 骑士注册

QQ登录

微博登录


重走LFS之路:(四) 工具链编译-1

2015-4-5 10:42    评论: 5 收藏: 4 分享: 8    

经过了充分的准备工作之后,我们要来着手工具链的编译。LFS不能直接使用宿主系统的编译器和库进行编译,而是用宿主系统的编译器和库再编译出来一份编译器和库,然后二次编译编译器和库,最后才能用最终的编译器来编译构建LFS系统。所以我们现在需要做的是来编译这些工具。

(题图来自: techradar.com)

这些工具的编译比较冗长,所以可能需要数篇的篇幅来记录这些过程。

首先需要创建一个目录来安置这些工具

mkdir -v $LFS/tools

然后为了方便,我们在根目录做了个软连接 /tools -> $LFS/tools

sudo ln -sv $LFS/tools /tools

1-createtoolsdirok1

这时候有个坑,LFS 7.7官方文档上写的命令是ln -sv $LFS/tools /,但是事实上在Debian 7.7版本实测,酱紫可能会有问题,就像这样

2-createtoolsdirfailed

接下来为了避免使用权限大的账号误操作造成宿主机损失,新建一个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

3-createlfsaccount

这里还有一个坑,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

4-createlfsenv

然后加载这个环境变量文件,并且查看一下是不是真的将环境变量都设置上了

source ~/.bashrc
export

5-lfsenvverify

事实证明我们的操作是有效的呃……

此时是有一个编译选项的,我起的虚拟机是单核的就无所谓了。如果你用了多核机器来做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的范围要大。

发表评论


最新评论

我也要发表评论

落沙有声 [Firefox 48.0|Windows 7] 2016-9-19 14:47
目测楼主的编译一个错都没报,我也按同样的方法来试了,总有一两个错,第二次编译根本通不过。
回复
7th 2015-4-5 21:29
binutils少了make那个步骤吧?
回复
御翎 2015-4-5 12:33  新浪微博网友评论
等等等,等看看编译内核部分
回复
dreamtale90 2015-4-5 12:03  新浪微博网友评论
mark
回复
张翔-西安理工大学 2015-4-5 11:03  新浪微博网友评论
非常值得试一次
回复
返回顶部

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”将网页分享至朋友圈。