2012.12.25 - 重口味LFS

Posted on 2013-02-18 16:10  SnakeHunt2012  阅读(293)  评论(0)    收藏  举报

晚上继续弄LFS,在弄version-check.sh的时候竟然发现我现在的sh竟然是dash,这是什么东西?然后上网百度才发现 “buntu6.10已将先前默认的bashshell更换为了dash。其表现是/bin/sh链接到了/bin/dash而不是传统的/bin /bash”,而更改过来的方法是:

shell> sudo dpkg-reconfigure dash

然后系统会询问你是否将dash用作默认shell,选择“否”就会改回正常的bash了。

然后试图搭建LFS,在读LFS-BOOK的时候发现创建LFS通常需要一个新的分区,但好在他给出了一个文档,上面写了如何在当前系统正在使用的分区上创建LFS,使得LFS跟当前系统公用一个分区,并且友好相处,而且貌似还可以从一个系统启动另一个系统,不影响相互的性能。

链接为:http://www.linuxfromscratch.org/hints/downloads/files/lfs_next_to_existing_systems.txt
上 面说:“This hint addresses only the aspects relevant to building and booting an LFS system next to other data on an existing partition rather than using a fresh, empty, dedicated partition.”

然后我就开始解压编译第五章中的包和补丁,不过真是悲催,在第一步解压的时候就发现错误,我在解压的时候:

shell> tar xzvf binutils-2.22.tar.bz2

报错说:

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

然后上网查发现了其中的问题,在tar的手册中:

-z, --gzip, --gunzip --ungzip

而我要解压的binutils-2.22.tar.bz却不是以gzip格式压缩的,所以不能用z参数,只能:

shell> tar xvf binutils-2.22.tar.bz2

这里tar的四个参数的意思分别为:

x - 解压缩
v - 报出详细信息
f - 指定文件
z - 用gzip对文件进行解压或压缩

然 后在编译Glibc-2.16.0的时候又遇到了问题,其实我觉得很有可能是在我解压之前的一次手误造成的,因为在解压Glibc之前是安装Linux- 3.5.2 API Headers,安装好之后忘了切换切换到上级目录和删除Linux-3.5.2 API Headers的两个目录,然后就直接在Linux-3.5.2 API Headers的build目录下执行了这两个操作:

if [ ! -r /usr/include/rpc/types.h ]; then
  su -c 'mkdir -p /usr/include/rpc'
  su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc'
fi



sed -i 's/ -lgcc_s//' Makeconfig

当 执行sed那条命令的时候,返回错误说我没有Makeconfig这个文件,我一看原来现在已经是在安装Glibc了,而我现在还在Linux Header的目录里,然后马上删除了Linux Header的两个目录,然后解压了Glibc的这个目录,然后继续执行,上面两个操作,然而执行到 make && make install的时候就出现了两个错误。后来,为了重新安装Glibc,我在Glibc需要的build目录下执行了make clean,然后又执行了make uninstall,希望能卸载刚刚安装过的Glibc,但是发现在卸载的时候也就是执行make uninstall的时候仍然有错误,于是我就直接删掉了Glibc的这两个目录然后重新解压继续执行。不过在make的时候还是有相同的错误:

/mnt/lfs/tools/bin/../lib/gcc/i686-lfs-linux-gnu/4.7.1/http://www.cnblogs.com/http://www.cnblogs.com/i686-lfs-linux-gnu/bin/ld: cannot find -lgcc_eh
collect2: error: ld returned 1 exit status
make[2]: *** [/mnt/lfs/sources/glibc-build/elf/sln] Error 1
make[2]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0/elf'
make[1]: *** [elf/others] Error 2
make[1]: Leaving directory `/mnt/lfs/sources/glibc-2.16.0'
make: *** [all] Error 2
lfs@Linux:/mnt/lfs/sources/glibc-build$ vi /usr/include/rpc/types.h
lfs@Linux:/mnt/lfs/sources/glibc-build$ ls /usr/include/rpc/types.h
/usr/include/rpc/types.h

晚上给任世军发短信询问这个问题,但是他一直没回。没办法,只能周五去问问任世军他老人家,而且这两天还不能关电脑。

不过后来这个问题解决了,在Google上搜是这样的:http://permalink.gmane.org/gmane.linux.lfs.devel/12744
我 试了一下,但还是出错误,没办法,试了各种办法,然后办法各种组合,最后回过头来看一下错误,我的错误是:“cannot find -lgcc_eh”,而论坛上的错误是“cannot find -lgcc_s”,然后我就想,干脆把书上说的“sed -i 's/ -lgcc_s//' Makeconfig” 改成 “sed -i 's/ -lgcc_eh//' Makeconfig”,后来在试一下果然错误就变了,但还是有错误,错误跟之前的一样他说我“cannot find -lgcc_s”,于是我照葫芦画瓢,重来的时候把两个操作都加上了即:

shell> sed -i 's/ -lgcc_s//' Makeconfig
shell> sed -i 's/ -lgcc_eh//' Makeconfig

最后果然就可以了,然后make install也正常执行,最后用书上说的sanity检查也没有问题:

lfs@Linux:/mnt/lfs/sources/glibc-build$ echo 'main(){}' > dummy.c
lfs@Linux:/mnt/lfs/sources/glibc-build$ $LFS_TGT-gcc dummy.c
lfs@Linux:/mnt/lfs/sources/glibc-build$ readelf -l a.out | grep ': /tools'
      [Requesting program interpreter: /tools/lib/ld-linux.so.2]

看样子应该就是可以了,但是还不敢断定,因为书上说还要等接下来安装Building的时候再进行一次检查,如果那次检查也通过就没事了,现在不能确定。