LFS编译记录

写在前

这个东西,花费了两天时间(周二早上,周三一天,周四早上),成功编译跑起来后感觉还是有点成就感的,毕竟花费了这么大的精力,有兴趣可以按照我的教程编译一个。

版本信息

vm:10.0.1
Windows 7 Ultimate, 64-bit
LFS:lfslivecd-x86-6.3-r2145(http://ftp.osuosl.org/pub/lfs-livecd/lfslivecd-x86-6.3-r2145.iso

参考文章

http://blog.csdn.net/u012333520/article/details/50533002
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28786922&id=3568918

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

磁盘分区

cfdisk /dev/hda

21

出错了,由于系统分配磁盘时不一定用hda作为名称,有可能是hdd或其他名称的,只要把名称找到并修改成相应的代码即可进入下一步
cd /dev
ls | grep hd

22
既然如此,使用hdd吧。

cfdisk /dev/hdd

23
【交换分区swap】
通过‘左右’键移动到【new】->【primary】->【size】输入512->【beginning】获得hdd1

【根分区】
通过‘上下’键移动到下一行,再通过‘左右’键移动【new】->【primary】->【size】默认->【beginning】获得hdd2

磁盘分区格式化

mkswap /dev/hdd1
mkfs.xfs /dev/hdd2

24

相关知识点:
  磁盘格式化一定要在磁盘分区未进行加载前进行。
  mkswap是用于将磁盘分区格式化为交换分区的命令。
  这里我将/dev/hdd2格式化了为Xfs格式,如果你喜欢其它格式的文件系统,你可以使用相应的命令来格式化。
注意:这里要根据实际情况建立和设置分区,如果你不太清楚这个问题,请先不要开始,否则可能造成难以恢复的损失!(这里只是根据VMWare里面的情况做的例子,在VMWare中相对安全些,建议初学者在虚拟机中开始。)

如果你的内存不太大,想在编译期间就使用上交换分区的话,可使用下面的命令激活交换分区
swapon /dev/hdd1
相关知识点:
  swapon用于激活交换分区
  swapoff用于将激活的交换分区停用
  可以通过free命令来查看当前的内存使用情况

开始制作LFS

创建LFS的“创作基地”

25

export LFS=/mnt/lfs
mkdir -pv $LFS
相关知识点
export LFS=/mnt/lfs这条命令的作用是为了后面引用“创作基地”的绝对路径方便而设置LFS这样的环境变量。
加载/dev/hdd2到“创作基地”
mount /dev/hdd2 $LFS
创建必要的目录并设置属性
创建源代码编译用目录
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources

26

相关知识点
chmod a+wt是将目录或文件的属性设置为1777,这样任何人都可以对其进行读写。
创建工具链目录
mkdir -v $LFS/toolsln -sv $LFS/tools /

27
注意

ln -sv $LFS/tools执行后应该会输出 
‘/tools’ -> ‘/mnt/lfs/tools’ 
表示正确。
相关知识点  
上面这两句就建立了神奇的工具链目录(是工具链目录不是工具链),这样的创建方式是为了在创建工具链和使用工具链创建目标系统的时候对于工具链的位置都是/tools,这样可保证工具链的正常使用
创建lfs用户
groupadd lfsuseradd -s /bin/bash -g lfs -m -k /dev/null lfs
设置lfs密码,设置为空就行了,也就是输入密码的时候直接回车即可
passwd lfs

28

将tools和sources目录的用户改为lfs,以便后面使用lfs来操作这两个目录
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources

29

登陆到lfs用户
su - lfs

30
注意

这时候你会发现命令行提示符已经由#改为了$
相关知识点
其实如果不使用lfs用root也是能完成工具链的,不过需要对root的环境变量进行修改,还要防止因为输入错误而导致覆盖主系统下的文件,所以LFS手册中制作工具链部分就是为了解决这种意外的发生而用lfs用户来建立工具链
建立lfs用户的环境
cat > ~/.bash_profile << "EOF"
PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/binexport LFS LC_ALL PATH
EOF
source ~/.bash_profile

31

相关知识点
这里利用了bash的环境变量的设置文件将lfs的环境设置为符合编译工具链要求的最少的环境参数 
这里面最重要的就是PATH这个参数,目的是为了能够利用工具链里面的工具制作工具链:首先查找/tools/bin下是否有需要的命令,如果没有再到 /bin和/usr/bin下找,然后用/bin或/usr/bin下面的命令来帮助生成需要的命令并放在/tools/bin下,这样此消彼涨,最终可完成一个自给自足的工具链。
进入LFS包编译目录
cd $LFS/sources

32

Binutils-2.17 - Pass 1
tar xvf /lfs-sources/binutils-2.17.tar.bz2
cd binutils-2.17
相关知识点
大家可以注意到后面所有的解包命令均使用tar xvf来完成,而不管文件的压缩方式是bz2还是gz,这是因为较新的tar程序都具有自动识别后缀名并自动调用相应的解压缩工具的能力,所以可以不需要 指定压缩方式,但对于早期的tar命令则可能不具备这个功能因此需要你根据包的压缩方式来指定,如bz2使用j,gz使用z,对应上面的binutils 则是tar xvjf /lfs-sources/binutils-2.17.tar.bz2 
因LFS的LiveCD中提供的tar版本比较新,后面制作的tar版本也比较新,因此支持自动识别的能力,同时为了使文章的解压命令看起来比较统一方便维护(同样对于想制作成脚本的朋友也会比较方便)因此后面统一使用tar xvf来解压

接着我们需要建立一个目录,因为binutils建议使用一个空目录来编译,所以

mkdir -v ../binutils-build
cd ../binutils-build
CC="gcc -B/usr/bin/" ../binutils-2.17/configure --prefix=/tools 
--disable-nls --disable-werror
make
make install
make -C ld clean
make -C ld LIB_PATH=/tools/lib
cp -v ld/ld-new /tools/bin
cd ..
rm -rf binutils-build
rm -rf binutils-2.17
GCC-4.1.2 - Pass 1
tar xvf /lfs-sources/gcc-4.1.2.tar.bz2
mkdir -v gcc-build
cd gcc-build
CC="gcc -B/usr/bin/" ../gcc-4.1.2/configure --prefix=/tools --with-local-prefix=/tools --disable-nls --enable-shared --enable-languages=c
make bootstrap
make install
ln -vs gcc /tools/bin/cc
cd ..
rm -rf gcc-build
rm -rf gcc-4.1.2

注意

CC=”gcc -B/usr/bin/../gcc-4.1.2/configure –prefix=/tools –with-local-prefix=/tools –disable-nls –enable-shared –enable-languages=c 
这是完整的一行代码,不可分成两行输入
注意:这里不要图省事而不删gcc-4.1.2,因为这样可能会给后面的编译产生一些意外的错误。
Linux-2.6.22.5 API Headers
tar xvf /lfs-sources/linux-2.6.22.5.tar.bz2
cd linux-2.6.22.5
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_installcp -rv dest/include/* /tools/include
cd ..
rm -rf linux-2.6.22.5
Glibc-2.5.1
tar xvf /lfs-sources/glibc-2.5.1.tar.bz2
cd glibc-2.5.1
mkdir -v ../glibc-build
cd ../glibc-build
../glibc-2.5.1/configure --prefix=/tools \
--disable-profile --enable-add-ons \
--enable-kernel=2.6.0 --with-binutils=/tools/bin \
--without-gd --with-headers=/tools/include \
--without-selinux
make
mkdir -v /tools/etc
touch /tools/etc/ld.so.conf
make install
cd ..
rm -rf glibc-build
rm -rf glibc-2.5.1
相关知识点
这里的参数–enable-kernel=2.6.0,只是为了说明kernel的大版本,所以不需要根据实际的kernel版本来改,即使是用linux-2.6.15也一样只写2.6.0就可以了
调整工具链
mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
gcc -dumpspecs | sed 's@^/lib/ld-linux.so.2@/tools&@g' > `dirname $(gcc -print-libgcc-file-name)`/specs
GCC_INCLUDEDIR=`dirname $(gcc -print-libgcc-file-name)`/include &&
find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; &&
rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` &&
unset GCC_INCLUDEDIR
相关知识点:
   工具链的调整方法有好几种,而且不同版本GCC的specs可能会有不同,但实际上都是把specs文件中的/lib/ld-linux.so.2替换 成了/tools/lib/ld-linux.so.2,所以即使有些文章在调整工具链上的命令和LFS手册上的不一样也不用太奇怪,当然也可以直接用 gcc -dumpspecs导出后手工直接编辑specs文件。
测试工具链的调整
echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep 'tools'

如果输出大致如下

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

则表示调整成功,因为所有的库已经连接到了/tools/lib下。

rm -rf a.out dummy.c

33

测试工具安装
说明:这部分将安装3个用于第六章各种源码包编译后的测试的工具,所以如果你不打算做make check之类的事情,那么这3个包可以不装。
Tcl-8.4.15 Expect-5.43.0 DejaGNU-1.4.4
tar xvf /lfs-sources/tcl8.4.15-src.tar.gz
cd tcl8.4.15/unix
./configure --prefix=/tools
make
make install
make install-private-headers
ln -sv tclsh8.4 /tools/bin/tclsh
cd $LFS/sources
tar xvf /lfs-sources/expect-5.43.0.tar.gz
cd expect
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值