Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1856423
  • 博文数量: 473
  • 博客积分: 13997
  • 博客等级: 上将
  • 技术积分: 5953
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-22 11:52
文章分类

全部博文(473)

文章存档

2014年(8)

2013年(38)

2012年(95)

2011年(181)

2010年(151)

分类: LINUX

2010-09-15 17:33:02

很幸运Google到这样一个网页


所以,现在终于可以开始着手从32位的iBox平台(我用它,你可以用你熟悉的任何发行版)建造一个64位系统了。不过,那里的描述是For LFS 5.0的。没关系,我们换成最新的软件就行了。

我一边翻译文章,一边做LFS,:)

=============================》原文翻译《===========================
介绍

Amd64,又名x86_64,是AMD族CPU的一种体系结构,包括Athon64和Opteorn两大系列。这些CPU本身有一个64位指令集,并能同时兼容流行的使用ia32架构的32位CPU。

本文描述一种方法,可以构建出一个基本的GNU/Linux系统,在尽量使用x86_64架构编译的同时,又能够拥有构建和运行ia32二进制文件的能力。这种技术很大程度上是基于LFS 5.0的,请参考有关资料了解这种构造方法的背景和技术原理。

我们假设你开始于一个已经更新的32位 GNU/Linux系统(本文作者用的是Slockware 9.1),并且在一台安装了x86_64CPU的机器上开始工作。

我们这套构建方法跟LFS 5.0主要的不同点有:

* 首先必须构建一套x86_64交叉编译工具链,而且要安装在宿主机器上;
* 一个x86_64的内核也必须首先构建出来,并安装在宿主机器上;
* 在基本系统构建好之后,必须要构建一个ia32兼容的库;
* 在此之后,需要构建一个具备multilib特性的gcc编译器;
* GRUB和LILO都不能编译成原生x86_64的,所以必须使用ia32的库来编译Grub。 

下一步:构建x86_64交叉编译工具链

这种方法是基于Andrew Walrond在x86_64.org邮件列表上的帖子,原始帖子在
http://www.x86-64.org/lists/discuss/msg03941.html

LFS 5.0使用的工具链是基于binutils-2.14、gcc-3.3.1、Linux-2.4.22和glibc-2.3.2的。
然而,由于使用这些版本编译gcc和glibc有困难,将用gcc-3.2.3和glibc-2.3.1代替。同时,Linux-2.4.23代替了Linux-2.4.22。

以下步骤将构建一个不带有multilib支持的x86_64工具链;换句话说,不支持生成ia32二进制文件。它将被安装在/opt/x86_64目录下。你需要从LFS取得glibc-2.3.2-sscanf-1.patch补丁,该补丁是可以如愿在glibc-2.3.1下使用的。


export CFLAGS=''
export CXXFLAGS=''
export _POSIX2_VERSION='199209'
export PATH=$PATH:/opt/x86-64/bin

tar xjvf binutils-2.14.tar.bz2
mkdir binutils-build
cd binutils-build
../binutils-2.14/configure --prefix=/opt/x86-64 --target=x86_64-unknown-linux 
make -j4
make install
cd ..
rm -rf binutils-2.14/ binutils-build/

tar xjvf gcc-3.2.3.tar.bz2
mkdir gcc-build
cd gcc-build
export CFLAGS='-Dinhibit_libc'
../gcc-3.2.3/configure --prefix=/opt/x86-64 --target=x86_64-unknown-linux --enable-languages=c --disable-shared --disable-multilib --enable-threads=single
make -j4
make install
cd ..
rm -rf gcc-build/ gcc-3.2.3/

tar xjvf linux-2.4.23.tar.bz2
cd linux-2.4.23
make mrproper
yes "" | make config
make include/linux/version.h
mkdir -p /opt/x86-64/x86_64-unknown-linux/include
cp -r include/linux/ include/asm-x86_64/ /opt/x86-64/x86_64-unknown-linux/include 
ln -s asm-x86_64 /opt/x86-64/x86_64-unknown-linux/include/asm
cd ..
rm -rf linux-2.4.23
unset CFLAGS

tar xjvf glibc-2.3.1.tar.bz2
cd glibc-2.3.1
tar xjvf glibc-linuxthreads-2.3.1.tar.bz2
patch -Np1 -i ../glibc-2.3.2-sscanf-1.patch 
mkdir ../glibc-build
cd ../glibc-build
echo 'BUILD_CC=gcc' > configparms
echo 'CC=x86_64-unknown-linux-gcc' >> configparms 
../glibc-2.3.1/configure --prefix=/opt/x86-64 \
--with-headers=/opt/x86-64/x86_64-unknown-linux/include \
--without-cvs --enable-kernel=2.4 --enable-add-ons \
--disable-profile \
--build=i686-pc-linux-gnu --host=x86_64-unknown-linux
make -j4
make install
cd ..
rm -rf glibc-2.3.1/ glibc-build/

最后,为了能够运行x86_64二进制文件,要能在/lib64目录下找到加载器,所以要创建这个软连接:
ln -s /opt/x86-64/lib/ /lib64

使用该交叉编译器需要/opt/x86_64/x86_64-unknown-linux/lib下乃锌馕募。也就是说,一些文件在该目录下,而另一些?opt/x86_64/lib下。我们创建一些软连接把他们放到一起。

(cd /opt/x86-64/x86_64-unknown-linux/lib && ln -s ../../lib/* .)

下一步:构建x86_64内核
======================================================

题外话:我看了那个帖子,上面说gcc3.2.3以后的版本有Bug,已经提交给开发组;该问题在3.3.2以后的版本将得到修正。也就是说,我们使用最新的3.4.3应当没问题。我晚上将着手构建一个工具链,将尝试使用最新的稳定版本来进行。大家拭目以待。

现在,使用前面构建的交叉编译工具链来构建Linux 2.4.23内核。

首先,确保新的交叉编译工具链在PATH里面。PATH里面要能够找到x86_64-unknown-linux-gcc,所以你可以这样做:
export PATH=/opt/x86-64/bin:$PATH

现在解开内核源文件,make mrproper,然后编辑Makefile。有两处必须修改:

* ARCH必须改成x86_64;
* CROSS_COMPILD必须改成x86_64-unknown-linux-

现在运行make menuconfig,或者其他你喜欢的东西修改内核配置。因为你现在还没有x86_64版本的modutils,所以你不能构建带模块的内核。你只需要临时用一下这个内核,所以可以尽量的小,但当然必须加进宿主文件系统的支持,因为等下要用来启动。记得要打开IA32模拟,否则你就用不了宿主系统了。编译出来的内核是放在arch/x86_64/boot/bzImage目录下。

构建好内核,并且使用宿主机的启动加载器安装它。现在,用新的内核来开机。

下一步:构建临时的构建系统
======================================================

这些步骤很大程度上与LFS 5.0第5章相似。具体的资料可以到那里参考。

这个构建过程与LFS 5的不同点主要有:

* 你必须确保在PATH中包含了交叉编译工具链,它应该位于/tools/bin之后但要在宿主机的32为工具链之前:
export PATH=/tools/bin:/opt/x86_64/x86_64-unknown-linux/bin:$PATH 
* 部分软件版本号有所不同:bison-1.75代替bison-1.875(GNU 服务器的所有者临时让bison-1.875不可用)。Linux-2.4.24代替Linux-2.4.23(因为前者更好)
* "锁定"glibc的步骤有所改变,因为动态连接器的名字和位置都有所改变。

下面给出完整的步骤,仅在和LFS 5.0有区别的地方做一下注释。

i686/x86_64 双重配置的惯例是i686的库放在/lib下,x86_64的库放在/lib64目录下。某些要构建的组件会将库文件放在/lib下面,即使你告诉他要放在/lib64下面。我们希望所有的库文件都放在同一个目录下面,既然我们现在还不需要i686的库,我们可以在构建binutils之前创建一些软连接:

mkdir /tools/lib
ln -s lib /tools/lib64

binutils-2.14, 第一遍

确保PATH已经如上设置好,让新的交叉编译器出现在宿主机的默认编译器之前。

mkdir ../binutils-build
cd ../binutils-build
../binutils-2.14/configure \
--prefix=/tools --disable-nls
make configure-host
make LDFLAGS="-all-static"
make install
make -C ld clean
make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib

gcc-3.3.1 第一遍

mkdir ../gcc-build
cd ../gcc-build
../gcc-3.3.1/configure --prefix=/tools \
--with-local-prefix=/opt/x86-64 \
--disable-nls --enable-shared \
--enable-languages=c 
make BOOT_LDFLAGS="-static" bootstrap
make install
ln -sf gcc /tools/bin/cc

--with-local-prefix=/opt/x86-64 这个选项确保编译过程使用的是交叉编译工具链的头文件。

linux-2.4.24 头文件
make mrproper
yes "" | make config
make include/linux/version.h
make symlinks
mkdir /tools/include/asm
cp include/asm/* /tools/include/asm
cp -R include/asm-generic /tools/include
cp -R include/linux /tools/include
touch /tools/include/linux/autoconf.h

glibc-2.3.2
tar xjvf ../glibc-linuxthreads-2.3.2.tar.bz2
mkdir /tools/etc
touch /tools/etc/ld.so.conf
patch -Np1 -i ../glibc-2.3.2-sscanf-1.patch
mkdir ../glibc-build
cd ../glibc-build
../glibc-2.3.2/configure --prefix=/tools \
--disable-profile --enable-add-ons \
--with-headers=/tools/include \
--with-binutils=/tools/bin \
--without-gd
make 
make install
make localedata/install-locales

锁定libc

在binutils-build目录运行:

make -C ld install

SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
sed -e 's@ /lib64/ld-linux-x86-64.so.2@ /tools/lib64/ld-linux-x86-64.so.2@g' \
$SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
sed -e 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
$SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
unset SPECFILE

rm -f /tools/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}

i686/x86_64双系统配置要求i686的库安装在/lib下,而x86_64的库安装在/lib64下。同时,动态加载器的名字也不同。技术上,既然我们不构建ia32的库,我们也许应当完全禁止spec文件中的32位配置。但是我留着它似乎也没什么害处,还是留着吧。

tcl-8.4.4 

cd unix
./configure --prefix=/tools
make 
make install

expect-5.39.0 

patch -Np1 -i ../expect-5.39.0-spawn.patch
./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no
make 
make SCRIPTS="" install

DejaGnu-1.4.3 

./configure --prefix=/tools
make install

gcc-3.3.1 第二遍

patch -Np1 -i ../gcc-3.3.1-no_fixincludes-2.patch
patch -Np1 -i ../gcc-3.3.1-specs-2.patch
mkdir ../gcc-build
cd ../gcc-build
../gcc-3.3.1/configure --prefix=/tools \
--with-local-prefix=/tools \
--disable-multilib \
--enable-clocale=gnu --enable-shared \
--enable-threads=posix --enable-__cxa_atexit \
--enable-languages=c,c++
make 
make -k check
make install

默认情况下,配置x86_64时gcc会尝试同时支持i686和x86_64。--disable-multilib 可以让它不再试图支持i686。

binutils-2.14, 第二遍

mkdir ../binutils-build
cd ../binutils-build
../binutils-2.14/configure --prefix=/tools \
--enable-shared --with-lib-path=/tools/lib
make -j 
make check
make install
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib

gawk-3.1.3 

./configure --prefix=/tools
make 
make install

coreutils-5.0 

./configure --prefix=/tools
make 
make install

bzip2-1.0.2 

make PREFIX=/tools install

gzip-1.3.5 

./configure --prefix=/tools
make 
make install

diffutils-2.8.1 

./configure --prefix=/tools
make 
make install

findutils-4.1.20 

./configure --prefix=/tools
make 
make install

make-3.80 

./configure --prefix=/tools
make 
make install

grep-2.5.1 

./configure --prefix=/tools \
--disable-perl-regexp --with-included-regex
make 
make install

sed-4.0.7 

./configure --prefix=/tools
make 
make install

gettext-0.12.1 

CXXFLAGS='-nostdlib' ./configure --prefix=/tools
make -j $CC_PARALLEL
make install

我发现 -nostdlib 选项需要用来防止C++编译器尝试连接到部分C运行库的两个拷贝。

ncurses-5.3 

patch -Np1 -i ../ncurses-5.3-etip-2.patch
patch -Np1 -i ../ncurses-5.3-vsscanf.patch

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

patch-2.5.4 

./configure --prefix=/tools
make 
make install

tar-1.13.25 

./configure --prefix=/tools
make 
make install

texinfo-4.6 

./configure --prefix=/tools
make 
make install

bash-2.05b 

patch -Np1 -i ../bash-2.05b-2.patch
./configure --prefix=/tools
make
make install
ln -s bash /tools/bin/sh

util-linux-2.12 

cp configure configure.backup
sed "s@/usr/include@/tools/include@g" configure.backup > configure 
./configure
make -C lib
make -C mount mount umount
make -C text-utils more
cp mount/{,u}mount text-utils/more /tools/bin

perl-5.8.0 

patch -Np1 -i ../perl-5.8.0-libc-3.patch
chmod u+w hints/linux.sh
echo 'static_ext="IO re Fcntl"' >> hints/linux.sh
./configure.gnu --prefix=/tools
make perl utilities
cp perl pod/pod2man /tools/bin
mkdir -p /tools/lib/perl5/5.8.0
cp -R lib/* /tools/lib/perl5/5.8.0

下一步:构建基本系统
======================================================
20040402:
经试验,第一遍编译GCC尚须添加--disable-multilib参数,否则后面无法编译glibc。此外,库文件的调整也很重要(mkdie /tools/lib && ln -s lib64 /tools/lib),如果不加调整,可以通过编译译,但后面编译Tck的时候会出现问题。而且,这样出来的系统似乎不是纯64位的。
因为不是使用LFC 5.0编译,因此不知道这是否原文的BUG

这是对LFS 5.0第6章的补充。

跟LFS5.0中的描述不同的地方有:
* 某些版本号不同。Linux-2.4.24 代替了 Linux-2.4.22 因为 2.4.24 更好。 Bison-1.75 代替 bison-1.875, 而 groff-1.17.2 代替 groff-1.19, 因为 bison-1.875 和 groff-1.19 目前在GNU服务器上不可用。File-4.06 代替 file-4.04 因为 file-4.04 在其主发布站上不可用。procps-3.1.15 用于准备2.6的内核行,虽然实际构建的是2.4般的内核。

* 库文件安装于/lib64和/usr/lib64而不是/lib和/usr/lib

* 重新调整工具链的步骤有所不同,因为动态加载器的名字和位置不同。

* shadow-4.0.3需要打一些附加的补丁

* Grub和Lilo都不能方便地构建为x86_64,因此构建grub要等到i686兼容性构筑好之后再来进行。

* Linux使用gcc-3.3.1构建;这里不尝试构建gcc-2.95。

首先完成LFS的步骤,直到“安装Linux 2.4.22 头文件”这里。同时创建目录/lib64、/usr/lib64,以及/usr/local/lib64。

linux-2.4.24 头文件

make mrproper
make include/linux/version.h
make symlinks
cp -HR include/asm /usr/include
cp -R include/asm-generic /usr/include
cp -R include/linux /usr/include
touch /usr/include/linux/autoconf.h

man-pages-1.60 

make install

glibc-2.3.2 

tar xjvf ../glibc-linuxthreads-2.3.2.tar.bz2 
touch /etc/ld.so.conf
patch -Np1 -i ../glibc-2.3.2-sscanf-1.patch
mkdir ../glibc-build
cd ../glibc-build
../glibc-2.3.2/configure --prefix=/usr \
--disable-profile --enable-add-ons \
--libexecdir=/usr/bin --with-headers=/usr/include
make
make check
make install
make localedata/install-locales
make -C ../glibc-2.3.2/linuxthreads/man
make -C ../glibc-2.3.2/linuxthreads/man install

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

publickey: files

hosts: files dns
networks: files

protocols: db files
services: db files
ethers: db files
rpc: db files

netgroup: db files

# End /etc/nsswitch.conf
EOF

cp --remove-destination /usr/share/zoneinfo/America/Los_Angeles /etc/localtime 

以上调整时区的命令应当根据你的实际情况加以调整。

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf

/usr/local/lib
/usr/lib

# End /etc/ld.so.conf
EOF

重新调整工具链,从binutils-build目录下执行:

make -C ld INSTALL=/tools/bin/install install

SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
sed -e 's@ /tools/lib64/ld-linux-x86-64.so.2@ /lib64/ld-linux-x86-64.so.2@g' \
$SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
sed -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g' \
$SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
unset SPECFILE

binutils-2.14 

expect -c "spawn ls"
mkdir ../binutils-build
cd ../binutils-build
../binutils-2.14/configure \
--prefix=/usr --enable-shared \
--libdir=/usr/lib64
make tooldir=/usr
make check
make tooldir=/usr install
cp ../binutils-2.14/include/libiberty.h /usr/include

gcc-3.3.1 

patch -Np1 -i ../gcc-3.3.1-no_fixincludes-2.patch
patch -Np1 -i ../gcc-3.3.1-suppress-libiberty.patch
mkdir ../gcc-build
cd ../gcc-build
../gcc-3.3.1/configure --prefix=/usr \
--libdir=/usr/lib64 \
--enable-shared --enable-threads=posix \
--enable-__cxa_atexit --enable-clocale=gnu \
--disable-multilib
make
make -k check
make install
ln -s ../usr/bin/cpp /lib
ln -s gcc /usr/bin/cc

--disable-multilib 命令防止编译器生成i686支持。除非已经有了i686兼容的Glibc存在,否则编译失败。

coreutils-5.0 

patch -Np1 -i ../coreutils-5.0-uname.patch
patch -Np1 -i ../coreutils-5.0-hostname-2.patch
./configure --prefix=/usr --libdir=/usr/lib64
make
make install-root

echo "dummy1:x:1000" >> /etc/group
echo "dummy2:x:1001:dummy" >> /etc/group
echo "dummy:x:1000:1000:::/bin/bash" >> /etc/passwd

make check-root
su dummy -c "make RUN_EXPENSIVE_TESTS=yes check"

sed -i.bak '/dummy/d' /etc/passwd /etc/group

make install
mv /usr/bin/{basename,cat,chgrp,chmod,chown,cp,dd,df} /bin
mv /usr/bin/{dir,dircolors,du,date,echo,false,head} /bin
mv /usr/bin/{install,ln,ls,mkdir,mkfifo,mknod,mv,pwd} /bin
mv /usr/bin/{rm,rmdir,shred,sync,sleep,stty,su,test} /bin
mv /usr/bin/{touch,true,uname,vdir} /bin
mv /usr/bin/chroot /usr/sbin
ln -s test /bin/[
ln -s ../../bin/install /usr/bin

zlib-1.1.4 

patch -Np1 -i ../zlib-1.1.4-vsnprintf.patch
./configure --prefix=/usr --libdir=/usr/lib64 --shared
make
make install
make clean
./configure --prefix=/usr
make
make test
make install
mv /usr/lib64/libz.so.* /lib64
ln -sf ../../lib64/libz.so.1 /usr/lib64/libz.so
gzip -9 -c zlib.3 > /usr/share/man/man3/zlib.3.gz

lfs-utils-0.3 

make
make install
cp etc/{services,protocols} /etc

findutils-4.1.20 

./configure --prefix=/usr --libdir=/usr/lib64 \
--libexecdir=/usr/bin --localstatedir=/var/lib/misc
make
make check
make install

gawk-3.1.3 

patch -Np1 -i ../gawk-3.1.3-libexecdir.patch
./configure --prefix=/usr --libexecdir=/usr/bin --libdir=/usr/lib64
make
make check
make install

ncurses-5.3 

patch -Np1 -i ../ncurses-5.3-etip-2.patch
patch -Np1 -i ../ncurses-5.3-vsscanf.patch
./configure --prefix=/usr --libdir=/usr/lib64 \
--with-shared --without-debug
make
make install
chmod 755 /usr/lib64/*.5.3
chmod 644 /usr/lib64/libncurses++.a
mv /usr/lib/libncurses.so.5* /lib64
ln -sf ../../lib64/libncurses.so.5 /usr/lib64/libncurses.so
ln -sf libncurses.so /usr/lib64/libcurses.so

vim-6.2 

echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
echo '#define SYS_GVIMRC_FILE "/etc/gvimrc"' >> src/feature.h
./configure --prefix=/usr --libdir=/usr/lib64
make
make install
ln -s vim /usr/bin/vi

M4-1.4 

./configure --prefix=/usr
make
make check
make install

bison-1.75 

./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

less-381 

./configure --prefix=/usr --bindir=/bin --sysconfdir=/etc --libdir=/lib64
make
make install

groff-1.17.2 

./configure --prefix=/usr --libdir=/usr/lib64
make
make install
ln -s soelim /usr/bin/zsoelim
ln -s eqn /usr/bin/geqn
ln -s tbl /usr/bin/gtbl

LFS 5.0使用的是groff-1.19,但该版本现在不在GNU服务器上。groff-1.18不能简单地在没有NetPBM的情况下构建,但是NetPBM自身需要一长串的依赖组件。这就是采用groff-1.17.2的原因。

sed-4.0.7 

./configure --prefix=/usr --bindir=/bin --libdir=/usr/lib64
make
make check
make install

flex-2.5.4a 

./configure --prefix=/usr
make
make bigcheck
make install
mv /usr/lib/libfl.a /usr/lib64
ln -s libfl.a /usr/lib64/libl.a

cat > /usr/bin/lex << "EOF"
#!/bin/sh
# Begin /usr/bin/lex

exec /usr/bin/flex -l "$@"

# End /usr/bin/lex
EOF
chmod 755 /usr/bin/lex

gettext-0.12.1 

./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

net-tools-1.60 

patch -Np1 -i ../net-tools-1.60-miitool-gcc33-1.patch

make config
make
make update

inetutils-1.4.2 

patch -Np1 -i ../inetutils-1.4.2-amd64.patch 
./configure --prefix=/usr --disable-syslogd \
--libexecdir=/usr/sbin --disable-logger \
--sysconfdir=/etc --localstatedir=/var \
--disable-whois --disable-servers \
--libdir=/usr/lib64
make
make install
mv /usr/bin/ping /bin

作者提供了inetutils-1.4.2-amd64.patch这个补丁用来修补在x86_64下编译遇到的一些问题。


perl-5.8.0 

./Configure
make
echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
make test
make install

交互式地运行 ./Configure,并在出现lib的有关选项时用/lib64代替。

texinfo-4.6 

./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

autoconf-2.57 

./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

automake-1.7.6 

./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install
ln -s automake-1.7 /usr/share/automake

bash-2.05b 

patch -Np1 -i ../bash-2.05b-2.patch
./configure --prefix=/usr --bindir=/bin --libdir=/usr/lib64
make
make tests
make install
exec /bin/bash --login +h

file-4.06 

./configure --prefix=/usr --libdir=/usr/lib64
make
make install

libtool-1.5 

./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

bzip2-1.0.2 

make -f Makefile-libbz2_so
make clean
make
make install

cp bzip2-shared /bin/bzip2
cp -a libbz2.so* /lib64
ln -sf ../../lib64/libbz2.so.1.0 /usr/lib64/libbz2.so
rm /usr/bin/{bunzip2,bzcat,bzip2}
mv /usr/bin/{bzip2recover,bzless,bzmore} /bin
ln -s bzip2 /bin/bunzip2
ln -s bzip2 /bin/bzcat
mv /usr/lib/libbz2.a /usr/lib64/

diffutils-2.8.1 

./configure --prefix=/usr --libdir=/usr/lib64
make
make install

ed-0.2 

patch -Np1 -i ../ed-0.2-mkstemp.patch
./configure --prefix=/usr
make
make check
make install
mv /usr/bin/{ed,red} /bin

kbd-1.08 

./configure
make
make install

e2fsprogs-1.3.4 

patch -Np1 -i ../e2fsprogs-1.34-pass1b.patch 
mkdir ../e2fsprogs-build
cd ../e2fsprogs-build
../e2fsprogs-1.34/configure --prefix=/usr --with-root-prefix="" \
--enable-elf-shlibs
make
make check
make install
make install-libs

会有一些关于整数到指针转换的警告。下面这个补丁是从e2fsprogs-1.35-WIP-1207.tar.gz反向移植过来的,可以修复这个问题。仍会有一些整形常量溢出的错误。


grep-2.5.1 

./configure --prefix=/usr --bindir=/bin \
--libdir=/usr/lib64 --with-included-regex
make
chmod a+x tests/*.sh
make check
make install

这里我们不能在x86_64下构建Grub 0.93。Grub要等到i686兼容性构筑起来之后再来构建。

gzip-1.3.5 

./configure --prefix=/usr --libdir=/usr/lib64
cp gzexe.in{,.backup}
sed 's%"BINDIR"%/bin%' gzexe.in.backup > gzexe.in
make
make install
mv /usr/bin/gzip /bin
rm /usr/bin/{gunzip,zcat}
ln -s gzip /bin/gunzip
ln -s gzip /bin/zcat
ln -s gunzip /bin/uncompress

man-1.5m2 

patch -Np1 -i ../man-1.5m2-manpath.patch
patch -Np1 -i ../man-1.5m2-pager.patch
patch -Np1 -i ../man-1.5m2-80cols.patch
./configure -default -confdir=/etc
make
make install

make-3.80 

./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

modutils-2.4.25 

./configure
make
make install

patch-2.5.4 

./configure --prefix=/usr --libdir=/usr/lib64
make
make install

procinfo-18 

make LDLIBS=-lncurses
make install

procps-3.1.11 

patch -Np1 -i ../procps-3.1.11-locale-fix.patch
make
make install
rm /lib64/libproc.so

psmisc-21.3 

./configure --prefix=/usr --exec-prefix=/
make
make install
ln -s killall /bin/pidof

shadow-4.0.3 

touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
chmod 644 /var/run/utmp /var/log/{btmp,lastlog,wtmp}
touch /usr/bin/passwd
patch -Np1 -i ../shadow-4.0.3-newgrp-fix.patch
patch -Np1 -i ../shadow-4.0.3-amd64-types.patch
./configure --prefix=/usr --libdir=/usr/lib64 --enable-shared
make
make install
cp etc/{limits,login.access} /etc

sed -e 's%/var/spool/mail%/var/mail%' \
-e 's%#MD5_CRYPT_ENAB.no%MD5_CRYPT_ENAB yes%' \
etc/login.defs.linux > /etc/login.defs

ln -s vipw /usr/sbin/vigr
rm /bin/vipw
mv /bin/sg /usr/bin
mv /usr/lib64/lib{shadow,misc}.so.0* /lib64
ln -sf ../../lib64/libshadow.so.0 /usr/lib64/libshadow.so
ln -sf ../../lib64/libmisc.so.0 /usr/lib64/libmisc.so
/usr/sbin/pwconv
/usr/sbin/grpconv

shadow 需要打两个补丁。shadow-4.0.3-newgrp-fix.patch 是标准的LFS补丁。作者提供的一个用于修补在x86_64下编译的一些问题。同时请注意库文件已经移动到了/lib64和/usr/lib64,检查软连接是否正常。


sysklogd-1.4.1 

patch -Np1 -i ../sysklogd-1.4.1-syslogd.patch
make
make install


cat > /etc/syslog.conf << "EOF"
# Begin /etc/syslog.conf

auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv.none -/var/log/sys.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.emerg *

# End /etc/syslog.conf
EOF

这个补丁用于修补在x86_64下编译的一些问题。


patch -Np1 -i ../sysvinit-2.85-crypt.patch 
patch -Np1 -i ../sysvinit-2.85-utmp.patch 
patch -Np1 -i ../sysvinit-2.85-init.patch 
patch -Np1 -i ../sysvinit-2.85-wall.patch
cp src/init.c{,.backup}
sed 's/Sending processes/Sending processes started by init/g' \
src/init.c.backup > src/init.c
make -C src
make -C src install

cat > /etc/inittab << "EOF"
# Begin /etc/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/init.d/rc sysinit

l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

su:S016:once:/sbin/sulogin

1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600

# End /etc/inittab
EOF

patch -Np1 -i ../sysvinit-2.85-crypt.patch 
patch -Np1 -i ../sysvinit-2.85-utmp.patch 
patch -Np1 -i ../sysvinit-2.85-init.patch 
patch -Np1 -i ../sysvinit-2.85-wall.patch
cp src/init.c{,.backup}
sed 's/Sending processes/Sending processes started by init/g' \
src/init.c.backup > src/init.c
make -C src
make -C src install

cat > /etc/inittab << "EOF"
# Begin /etc/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/init.d/rc sysinit

l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

su:S016:once:/sbin/sulogin

1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600

# End /etc/inittab
EOF

以下几个补丁用于修复x86_64下构建的一些问题。




tar-1.13.25 

./configure --prefix=/usr --bindir=/bin \
--libexecdir=/usr/bin --libdir=/usr/lib64
make
make check
make install

util-linux-2.12 

cp hwclock/hwclock.c{,.backup}
sed 's%etc/adjtime%var/lib/hwclock/adjtime%' \
hwclock/hwclock.c.backup > hwclock/hwclock.c
mkdir -p /var/lib/hwclock

./configure
make HAVE_SLN=yes
make HAVE_SLN=yes install

lfs-bootscripts 

cp -a rc.d sysconfig /etc
chown -R root:root /etc/rc.d /etc/sysconfig

下一步:构筑ia32兼容性
======================================================

在x86_64平台上,gcc和binutils都已经可以生成i686和x86_64的代码了。但我们还需要一个i686兼容的glibc。直接交叉编译glibc会相当困难,所以我们要交叉编译整个i686工具链,用来编译glibc。

LFS中使用的gcc和glibc在交叉编译时会有问题,所以我们使用gcc 3.2.3和glibc2.3.1代替。

构建好交叉编译器之后,我们用它来编译一个原生的工具链。这次将使用gcc 3.3.1和glibc 2.3.2。然后,我们再次编译一次工具链,于是这次它是自足的了。于是,glibc要分三个阶段来构建:

* 0 i686-pc-linux-gnu 交叉编译,2.14/3.2.3/2.3.1
* 1 i686-pc-linux-gnu 原生工具链, 2.14/3.3.1/2.3.2
* 2 i686-pc-linux-gnu 自足工具链, 2.14/3.3.1/2.3.2

在此之后,我们再一次在x86_64下编译gcc,这次要打开multilib支持。

现在,去掉已有的/lib软连接,
rm /lib

现在保存PATH环境变量,临时把它设为首先搜索前两个步骤构建出来的工具链。要创建一个新的/lib连接指向Stage0:

export ORIG_PATH=$PATH
export PATH=/tc-stage1/bin:/tc-stage0/bin:$ORIG_PATH
ln -s /tc-stage0/lib /lib
set +h

binutils-2.14, stage 0 

mkdir ../binutils-build
cd ../binutils-build
../binutils-2.14/configure --prefix=/tc-stage0 \
--target=i686-pc-linux-gnu \
--with-lib-path=/tc-stage0/lib 
make -j4 
make install

make -C ld clean
make -C ld LIB_PATH=/tc-stage0/i686-pc-linux-gnu/lib:/tc-stage0/lib
(不要删除binutils-build) 

gcc-3.2.3, stage 0 

mkdir ../gcc-build
cd ../gcc-build
export CFLAGS='-Dinhibit_libc' 
../gcc-3.2.3/configure --prefix=/tc-stage0 \
--target=i686-pc-linux-gnu \
--enable-languages=c \
--disable-shared \
--enable-threads=single \
--host=i686-pc-linux-gnu
make -j4 
make install
unset CFLAGS

linux-2.4.24 headers, stage 0 

make mrproper
make include/linux/version.h

mkdir -p /tc-stage0/include
cp -r include/linux/ include/asm-i386/ /tc-stage0/include 
ln -s asm-i386 /tc-stage0/include/asm

glibc-2.3.1, stage 0 

patch -p1 -i../glibc-2.3.2-sscanf-1.patch 
tar xjvf ../glibc-linuxthreads-2.3.1.tar.bz2
mkdir ../glibc-build
cd ../glibc-build
../glibc-2.3.1/configure --prefix=/tc-stage0 \
--with-headers=/tc-stage0/include \
--without-cvs --enable-kernel=2.4 --enable-add-ons \
--disable-profile --libdir=/tc-stage0/lib \
--host=i686-pc-linux-gnu --build=x86_64-unknown-linux
make -j4
make install
make localedata/install-locales

调整ld指向新的glibc,进入binutils-build,执行
make -C ld install

SPECFILE=/tc-stage0/lib/gcc-lib/*/*/specs &&
sed -e 's@ /lib/ld-linux.so.2@ /tc-stage0/lib/ld-linux.so.2@g' \
$SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
unset SPECFILE
rm -f /tc-stage0/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}

现在删掉binutils-build。
我们现在已经得到一个交叉编译出来的工具链,我们利用它编译原生的工具链:

gcc-3.3.1, stage 1 

mkdir ../gcc-build
cd ../gcc-build
../gcc-3.3.1/configure --prefix=/tc-stage1 \
--with-local-prefix=/tc-stage0 \
--disable-nls --enable-shared \
--enable-languages=c \
--host=i686-pc-linux-gnu \
--target=i686-pc-linux-gnu
make BOOT_LDFLAGS="-static" bootstrap
make install


linux-2.4.24 headers, stage 1 

make mrproper
make include/linux/version.h

mkdir -p /tc-stage1/include
cp -r include/linux/ include/asm-i386/ /tc-stage1/include 
ln -s asm-i386 /tc-stage1/include/asm
touch /tc-stage1/include/linux/autoconf.h


glibc-2.3.2, stage 1 

patch -Np1 -i ../glibc-2.3.2-sscanf-1.patch
tar xjvf ../glibc-linuxthreads-2.3.2.tar.bz2
mkdir ../glibc-build
cd ../glibc-build
../glibc-2.3.2/configure --prefix=/tc-stage1 \
--disable-profile --enable-add-ons \
--with-headers=/tools/include \
--with-binutils=/tools/bin \
--without-gd \
--build=i686-pc-linux-gnu \
--target=i686-pc-linux-gnu
make
make check
make install
make localedata/install-locales

locking-in glibc, stage 1 

Change to the binutils-build directory. 

make -C ld install

SPECFILE=/tc-stage1/lib/gcc-lib/*/*/specs &&
sed -e 's@ /lib/ld-linux.so.2@ /tc-stage1/lib/ld-linux.so.2@g' \
$SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
unset SPECFILE

rm -f /tc-stage1/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}

现在我们完成了原生的工具链。可以用它来编译自足的工具链了。

gcc-3.3.1, stage 2 

patch -Np1 -i ../gcc-3.3.1-no_fixincludes-2.patch
patch -Np1 -i ../gcc-3.3.1-specs-tc-stage1.patch

mkdir ../gcc-build
cd ../gcc-build
../gcc-3.3.1/configure --prefix=/tc-stage1 \
--with-local-prefix=/tc-stage1 \
--enable-clocale=gnu --enable-shared \
--enable-threads=posix --enable-__cxa_atexit \
--enable-languages=c \
--host=i686-pc-linux-gnu \
--target=i686-pc-linux-gnu
make
make install

binutils-2.14, stage 2 

mkdir ../binutils-build
cd ../binutils-build
../binutils-2.14/configure --prefix=/tc-stage1 \
--enable-shared --with-lib-path=/tc-stage1/lib
make 
make install

到这里,binutils-build目录可以马上删掉了。

glibc-2.3.2, stage 2 

一般来说,GNU/Linux系统上的glibc正常配置是放在/lib下,一些文件可能在/usr/lib。在GNU/Linux下这会自动完成,如果你给出--prefix=/usr配置参数的话。但我们不能使用这个参数,因为除了库文件,我们不希望任何东西安装在/usr下。为了达到这个目标,将库安装在/lib、/usr/lib,其他所有东西要安装在一个没用的地方。将需要一个配置参数文件指出我们需要做什么。

patch -p1 -i../glibc-2.3.2-sscanf-1.patch 
tar xjvf ../glibc-linuxthreads-2.3.2.tar.bz2
mkdir ../glibc-build
cd ../glibc-build

cat >>configparms <<__END__
libdir=/usr/lib
slibdir=/lib
sysconfdir=/etc
__END__

../glibc-2.3.2/configure --prefix=/tc-stage1 \
--with-headers=/tc-stage1/include \
--without-cvs --enable-kernel=2.4 --enable-add-ons \
--disable-profile \
--target=i686-pc-linux-gnu \
--build=i686-pc-linux-gnu
make -j4
rm /lib
mkdir /lib
chmod 755 /lib
make install


带multilib的gcc-3.3.1 

mkdir ../gcc-build
cd ../gcc-build
../gcc-3.3.1/configure --prefix=/usr \
--enable-shared --enable-threads=posix \
--enable-__cxa_atexit --enable-clocale=gnu 
make
make install

这样会构建所有gcc支持的语言。你可以指定--enable-languages 参数来指定其中的一部分,这样编译过程更快,而且占用的空间更小。例如,--enable-languages=c,c++仅构建C和C++语言的编译器,这似乎是LFS用户需要的最小集了。

到这个时候,/tc-stage0和/tc-stage1两个目录可以删除掉了。

下一步:构建Grub
======================================================

因为不能构建x86_64的grub,我们只好等到有能力构建ia32二进制文件的时候再来构建grub。现在我们可以构建grub了。
grub-0.93 

patch -Np1 -i ../grub-0.93-gcc33-1.patch
patch -Np1 -i ../grub-0.93-fixes-1.patch
CFLAGS='-O2 -m32' ./configure --prefix=/usr i686-pc-linux-gnu
make
make install
mkdir /boot/grub
cp /usr/share/grub/i386-pc/stage{1,2} /boot/grub
cp /usr/share/grub/i386-pc/{e2fs,reiserfs}_stage1_5 /boot/grub

grub-0.93-fixes-1.patch 来自LFS cvs提交列表中的一个帖子。CFLAGS中的'-m32'一项告诉gcc应该编译成ia32代码。i686-pc-linux-gnu告诉配置器生成的二进制文件应该是ia32的。用这些设置,加上具备multilib能力的gcc,便可以构建出ia32的grub。

下一步:完成!
======================================================
阅读(1151) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~