参考:LFS编译——准备Host系统

前言

在准备好Host环境后,接下来构造一个临时Linux系统。该系统包含****构建所需要的工具。构造临时Linux系统分两步:

构建一个宿主系统无关的新工具链(编译器、汇编器、链接器、库和一些有用的工具)
使用该工具链构建其它的基础工具。

编译binutils-阶段1

解压binutils-2.27.tar.bz2包

tar -xvf binutils-2.27.tar.bz2

binutils作为第一个要编译的包,提供了linker、assembler以及其他处理目标文件(object files)的工具

创建一个专用的编译目录

mkdir -v build
cd build

编译binutils

../configure --prefix=/tools \
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror
make
case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
make install

编译gcc-阶段1

解压gcc-6.2.0.tar.bz2

tar -xvf gcc-6.2..tar.bz2 

GCC 需要 GMP、 MPFR 和 MPC 软件包

cd gcc-6.2.
tar -xf ../mpfr-3.1..tar.xz
mv -v mpfr-3.1. mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0. gmp
tar -xf ../mpc-1.0..tar.gz
mv -v mpc-1.0. mpc

更改gcc默认动态链接器的位置,转而使用/tools下面的。他是在gcc搜索路径中移除/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

lfs:/mnt/lfs/sources/gcc-6.2.$ pwd
/mnt/lfs/sources/gcc-6.2.
lfs:/mnt/lfs/sources/gcc-6.2.$ mkdir -v build
mkdir: created directory 'build'
../configure \
--target=$LFS_TGT \
--prefix=/tools \
--with-glibc-version=2.11 \
--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-libmpx \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--enable-languages=c,c++
make -j4
make install

cd /mnt/lfs/sources

rm -rf gcc-6.2.0

编译linux-4.7.2

Linux内核需要向系统C库(LFS下指的是Glibc)暴露API接口。

解压linux-4.7.2.tar.xz

tar -xvf linux-4.7..tar.xz

make mrproper

make INSTALL_HDR_PATH=dest headers_install

cp -rv dest/include/* /tools/include

编译Glibc-2.24

tar -xvf glibc-2.24.tar.xz  

cd glibc-2.24 

mkdir -v build
cd build/

../configure \
--prefix=/tools \
--host=$LFS_TGT \
--build=$(../scripts/config.guess) \
--enable-kernel=2.6. \
--with-headers=/tools/include \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes

make -j4

make install

cd ../..

rm -rf glibc-2.24(其实前面那些编译完的包都可以删除)

echo 'int main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools'

输出如下内容表明一切正常:[Requesting program interpreter: /tools/lib/ld-linux.so.2]

rm -v dummy.c a.out

编译Libstdc++

Libstdc++是gcc的一部分,他的编译工作还是在gcc目录下完成

tar -xvf gcc-6.2.0.tar.bz2

cd gcc-6.2.0

mkdir -v build

cd build/

../libstdc++-v3/configure \
--host=$LFS_TGT \
--prefix=/tools \
--disable-multilib \
--disable-nls \
--disable-libstdcxx-threads \
--disable-libstdcxx-pch \
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/6.2.

make -j4

make install

cd ../..

rm -rf  gcc-6.2.0

编译Binutils-阶段2

tar -xvf binutils-2.27.tar.bz2

mkdir -v build

cd build

CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../configure \
--prefix=/tools \
--disable-nls \
--disable-werror \
--with-lib-path=/tools/lib \
--with-sysroot

make -j4

make install

cd ../..

编译gcc-阶段2

tar -xvf gcc-6.2.0.tar.bz2

cd gcc-6.2.0

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
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
tar -xf ../mpfr-3.1..tar.xz
mv -v mpfr-3.1. mpfr
tar -xf ../gmp-6.1..tar.xz
mv -v gmp-6.1. gmp
tar -xf ../mpc-1.0..tar.gz
mv -v mpc-1.0. mpc

mkdir -v build
cd build

CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../configure \
--prefix=/tools \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--enable-languages=c,c++ \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp

make -j4

make install

ln -sv gcc /tools/bin/cc

cd ../../

echo 'int main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

输出:[Requesting program interpreter: /tools/lib/ld-linux.so.2]表示一切顺利

rm -v dummy.c a.out

编译Tcl-core

tar -xvf tcl-core8.6.6-src.tar.gz

cd tcl8.6.6/

cd unix

./configure --prefix=/tools

make -j4

TZ=UTC make test

make install

chmod -v u+w /tools/lib/libtcl8.6.so

make install-private-headers

ln -sv tclsh8.6 /tools/bin/tclsh

cd ../..

rm -rf tcl8.6.6/

编译Expect

tar -xvf expect5.45.tar.gz

cd expect5.45

cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure

./configure --prefix=/tools \
--with-tcl=/tools/lib \
--with-tclinclude=/tools/include

make -j4

make SCRIPTS="" install

cd ..

rm -rf expect5.45

编译DejaGNU

tar -xvf dejagnu-1.6.tar.gz
cd dejagnu-1.6

./configure --prefix=/tools

make install

make check

编译Check

tar -xvf check-0.10.0.tar.gz

cd check-0.10.0

PKG_CONFIG= ./configure --prefix=/tools

make -j4

make check

make install

编译Ncurses

tar -xvf ncurses-6.0.tar.gz

cd ncurses-6.0

sed -i s/mawk// configure

./configure --prefix=/tools \
--with-shared \
--without-debug \
--without-ada \
--enable-widec \
--enable-overwrite

make -j8
make install

cd ..

rm -rf ncurses-6.0

编译Bash

tar -xvf bash-4.3.30.tar.gz
cd bash-4.3.30
./configure --prefix=/tools --without-bash-malloc
make -j8
make install

cd ..

rm -rf bash-4.3.30

编译Bzip2

tar -xvf bzip2-1.0.6.tar.gz

cd bzip2-1.0.6

make

make PREFIX=/tools install

cd ..

rm -rf bzip2-1.0.6

编译Coreutils

tar -xvf coreutils-8.25.tar.xz

cd coreutils-8.25

./configure --prefix=/tools --enable-install-program=hostname

make -j8

make install

编译Diffutils

tar -xvf diffutils-3.5.tar.xz

cd diffutils-3.5

./configure --prefix=/tools

make -j8

make install

cd ..

rm -rf diffutils-3.5

编译File

tar -xvf file-5.28.tar.gz

cd file-5.28

./configure --prefix=/tools

make -j8

make install

cd ..

rm -rf file-5.28

编译Findutils

tar -xvf findutils-4.6.0.tar.gz
cd findutils-4.6.0
./configure --prefix=/tools
make -j8
make install
cd ..
rm -rf findutils-4.6.0

安装Gawk

tar -xvf gawk-4.1.3.tar.xz
cd gawk-4.1.3
./configure --prefix=/tools
make -j8
make install
cd ..
rm -rf gawk-4.1.3

编译Gettext

tar -xvf gettext-0.19.8.1.tar.xz
cd gettext-0.19.8.1
cd gettext-tools
EMACS="no" ./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C intl pluralx.c
make -C src msgfmt
make -C src msgmerge
make -C src xgettext
cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin
cd ../..
rm -rf gettext-0.19.8.1

编译Grep

tar -xvf grep-2.25.tar.xz
cd grep-2.25
./configure --prefix=/tools
make -j8
make install
cd ..
rm -rf grep-2.25

编译Gzip

tar -xvf gzip-1.8.tar.xz
cd gzip-1.8
./configure --prefix=/tools
make -j8
make install
cd ..
rm -rf gzip-1.8

编译M4

tar -xvf m4-1.4.17.tar.xz
cd m4-1.4.17
./configure --prefix=/tools
make -j8
make install
cd ..
rm -rf m4-1.4.17

编译Make

tar -xvf make-4.2.1.tar.bz2
cd make-4.2.1
./configure --prefix=/tools --without-guile
make -j8
make install

cd ..

rm -rf m4-1.4.17

编译Patch

tar -xvf patch-2.7.5.tar.xz
cd patch-2.7.5
./configure --prefix=/tools
make -j8
make install
cd ..
rm -rf patch-2.7.5

编译Perl

tar -xvf perl-5.24.0.tar.bz2
cd perl-5.24.0
sh Configure -des -Dprefix=/tools -Dlibs=-lm
make -j8
cp -v perl cpan/podlators/scripts/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.24.0
cp -Rv lib/* /tools/lib/perl5/5.24.0
cd ..
rm -rf perl-5.24.0

编译Sed

tar -xvf sed-4.2.2.tar.bz2
cd sed-4.2.2
./configure --prefix=/tools
make -j8
make install
cd ..
rm -rf sed-4.2.2

编译Tar

tar -xvf tar-1.29.tar.xz
cd tar-1.29
./configure --prefix=/tools
make -j8
make install
cd ..
rm -rf tar-1.29

编译Texinfo

tar -xvf texinfo-6.1.tar.xz
cd texinfo-6.1
./configure --prefix=/tools
make -j8
make install
cd ..
rm -rf texinfo-6.1

编译Util-linux

tar -xvf util-linux-2.28.1.tar.xz
cd util-linux-2.28.1

./configure --prefix=/tools \
--without-python \
--disable-makeinstall-chown \
--without-systemdsystemunitdir \
PKG_CONFIG=""

make -j8
make install
cd ..
rm -rf util-linux-2.28.1

编译Xz

tar -xvf xz-5.2.2.tar.xz
cd xz-5.2.2
./configure --prefix=/tools
make -j8
make install
cd ..
rm -rf xz-5.2.2

LFS7.10——构造临时Linux系统的更多相关文章

  1. windows 10下安装linux系统

    理员权限打开powershell,输入 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-L ...

  2. U盘10分钟安装linux系统

    说来可能不信,10分钟包括创建U盘启动盘,用U盘启动,安装,不联网,不更新,不安装语言包,等装好系统再更新. Windows系统硬盘分区 如果你用的是Windows系统,现有的硬盘没有未分配的空间,需 ...

  3. 10秒完成Linux系统pip在线安装

    对于Python开发攻城狮及系统运维攻城狮来说,pip的安装那是必不可少的一个过程.鉴于网上很多安装过程写得过于复杂,本人根据pip官方手册总结了以下最为快捷的安装方式,只需要2步操作. curl h ...

  4. LFS7.10——构建LFS系统

    参考:LFS7.10——准备Host系统 LFS7.10——构造临时Linux系统 本文正式开始构建LFS系统,后面所有命令的执行都是在root用户下完成的. 这时开始构建LFS前准备工作 更改$LF ...

  5. Linux系统调优权威指南

    1.关闭SELINUX功能1.1 修改配置文件,使关闭SELINUX永久生效sed 's#SELINUX=enforcing#SELINUX=disables#g' /etc/selinux/conf ...

  6. linux系统修改CST时区

    ================================================= [root@tzyyserveryg ~]# date -R Fri, 28 Nov 2014 08 ...

  7. 第10章 嵌入式Linux 的调试技术

    10.1  打印内核调试信息:printk printk位函数运行在内核空间, printf函数运行在用户空间.也就是说,像Linux 驱动这样的Linux内核程序只能使用printk函数输出调试信息 ...

  8. WSL2:我在原生的Win10玩转Linux系统

    原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. WSL2:我在原生的Win10玩转Li ...

  9. Linux内核分析-构造一个简单的Linux系统MenuOS

    构造一个简单的Linux系统MenuOS linux内核目录结构 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel C ...

随机推荐

  1. redis连接池——JedisPool和JedisCluster的介绍与使用

    目录 Jedis使用方式的介绍 Redis连接池介绍 创建连接池配置文件 单机版的Redis连接池 集群版的Redis连接池 总结 Jedis使用方式的介绍 Jedis就是Java实现的操作Redis ...

  2. 机动车驾驶(1)--- 禁令标志汇总 by John

    以下是普通标志牌(新车安全)

  3. mysql查询之 用户行程的取消率,人流量高峰时段

    1.用户行程的取消率 Trips 表中存所有出租车的行程信息.每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键.Status 是枚举类 ...

  4. 【OpenCV开发】OpenCV3后IPLimage转换成MAT的问题

    IplImage* img1 = cvCreateImage(cvGetSize(resizeRes), IPL_DEPTH_8U, 1);//创建目标图像 Mat test = img1;  报错 ...

  5. ubuntu18.04安装Anaconda

    jiangshan@dell-Precision-7920-Tower:~$ lsAnaconda3-2019.07-Linux-x86_64.shjiangshan@dell-Precision-7 ...

  6. 【C++札记】虚继承

    由于多重继承产生的二义性引入了类的虚继承,先看下什么是二义性. 类D是类B和类C的派生类,而类B,类C就是继承于类A,当D调用类A中的函数时不知道是类B继承A的,还是类C继承A的,引起了二义性.虚继承 ...

  7. python学习-63 组合

    组合 1.什么是组合? 定义一个类,由数据属性构成,这几个属性又可以是通过一个类实例化的对象,这就是组合. 举例: class School: def __init__(self,name,addre ...

  8. Golang 实现单例模式

    目录 只适用于单线程环境 支持并发版本 优化并发版本 sync.Once版本 只适用于单线程环境 package main import "fmt" type Single str ...

  9. HTTPDNS

    传统 DNS 缺点 1.域名缓存问题     它可以在本地做一个缓存,也就是说,不是每一个请求,它都会去访问权威 DNS 服务器,而是访问过一次就把结果缓存到自己本地,当其他人来问的时候,直接就返回这 ...

  10. (转)WEB服务器_IIS配置优化指南

    原文地址:https://www.cnblogs.com/heyuquan/p/deploy-iis-set-performance-guide.html 通常把站点发布到IIS上运行正常后,很少会去 ...