很幸运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) |