LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: 地球发动机

用x86_64的都来看看!从32位提升到64位实战直播!

[复制链接]
 楼主| 发表于 2005-3-31 15:44:22 | 显示全部楼层
===================》原文翻译《===========================
构建基本系统

这是对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下编译遇到的一些问题。
http://home.ix.netcom.com/~ejohn ... s-1.4.2-amd64.patch

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反向移植过来的,可以修复这个问题。仍会有一些整形常量溢出的错误。
http://home.ix.netcom.com/~ejohn ... s-1.34-pass1b.patch

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,检查软连接是否正常。
http://home.ix.netcom.com/~ejohn ... 3-amd64-types.patch

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下编译的一些问题。
http://home.ix.netcom.com/~ejohn ... 1.4.1-syslogd.patch

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:S016nce:/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:S016nce:/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下构建的一些问题。
http://home.ix.netcom.com/~ejohn ... nit-2.85-utmp.patch
http://home.ix.netcom.com/~ejohn ... nit-2.85-init.patch
http://home.ix.netcom.com/~ejohn ... nit-2.85-wall.patch

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兼容性
======================================================
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-31 16:25:56 | 显示全部楼层
(终于来到这里了!这里是整个提升过程最复杂的一步,前面虽然步骤颇多,但基本上也就是解压、打补丁、配置、编译、安装几大板斧,所用的配置选项也就那么几个常用的,但这里就不同了,虽然翻来覆去就是那几个组件在折腾,但原理却非常深奥,而且每次都要用不同的选项去配置,清细心研读)
===================》原文翻译《===========================
构筑IA-32兼容性

在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/binORIG_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
======================================================
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-31 16:37:23 | 显示全部楼层
===================》原文翻译《===========================
构建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。

下一步:完成!
======================================================
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-31 16:45:18 | 显示全部楼层
===================》原文翻译《===========================
完成!

到了这里,系统已经准备好继续进行LFS 第7到第9章的设置了。当构建Linux内核的时候,记得不要使用Linux 2.95.3。故make步骤中CC=/opt/gcc-2.95.3/bin/gcc不再需要。也不需要修改Makefile中的ARCH和CROSS_COMPILE;这些架构应该能够自动适应。由于我们已经有了64位的modutils,新内核中也可以使用模块了。新的内核会存放在arch/x86_64/bzImage里面。
======================================================
回复 支持 反对

使用道具 举报

发表于 2005-3-31 17:40:49 | 显示全部楼层
建议斑竹置顶,成功后加精。
回复 支持 反对

使用道具 举报

发表于 2005-3-31 21:55:57 | 显示全部楼层
加精了好,等买了64的再看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-1 14:21:18 | 显示全部楼层
实战评述:构建x86_64交叉编译工具链

我试用过各种可用的版本来编译交叉工具链,结果说明如下:
1、binutils最新版本可以用来交叉编译。我采用2.15.94.0.2.2。
2、gcc3.2.3以上版本,直到3.4.3版本,均不能交叉编译。4.0没试过。
3、glibc2.3.1以上版本均不能交叉编译。
4、采用最新的Linux2.6.11内核头文件时,要注意连带asm-generic目录一起cp过去。

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
编译出来的东西装在/opt/x86-64目录下,生成的代码是x86-64的。
make -j4
估计作者的机器是Optron的,我的Amd64用-j4会出问题。直接make就可以。
make install
安装构建好的binutils
cd ..
rm -rf binutils-2.14/ binutils-build/
删除临时构建目录。

tar xjvf gcc-3.2.3.tar.bz2
解开源代码包。为了加快下载速度,我下载的是gcc-core-3.2.3包,因为我们不需要其他语言的支持,只要c语言就可以。
mkdir gcc-build
cd gcc-build
创建构建目录
export CFLAGS='-Dinhibit_libc'
防止编译过程使用c函数库
../gcc-3.2.3/configure --prefix=/opt/x86-64 --target=x86_64-unknown-linux --enable-languages=c --disable-shared --disable-multilib --enable-threads=single
安装在/opt/x86-64下,生成的编译器是出x86_64代码的,只生成c语言编译器,不生成共享库,不提供多重库支持(生成的编译器只能生成64位代码),不用多线程
make -j4
同上,make就可以了。
make install
安装
cd ..
rm -rf gcc-build/ gcc-3.2.3/
清理。

tar xjvf linux-2.4.23.tar.bz2
解开源码包。我用的是2.6.11
cd linux-2.4.23
make mrproper
清理源码目录
yes "" | make config
又学到一招了。原来我还以为make config是不会有人用的呢。原来有此妙用。这里不需要编译内核,所以不用管内核怎么配置的。为了加快速度,用yes ""自动向make config输入"yes",这样就不需要人工干预了,高!实在是高!
make include/linux/version.h
本来不需要前面那个自动配置也可以,但因为要生成version.h文件,所以必须要运行前面那个来生成Makefile,然后这条命令才能执行成功。
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
对于我使用的内核,这条命令要写成
cp -r include/linux/ include/asm-x86_64/ include/asm-generic/ /opt/x86-64/x86_64-unknown-linux/include
因为asm-x86_64目录里面的头文件要引用asm-generic目录里面的头文件,所以如果不这样写,后面编译glibc就不能成功。
ln -s asm-x86_64 /opt/x86-64/x86_64-unknown-linux/include/asm
创建一个符号连接,将asm-x86_64连接到asm。这是必须的,因为glibc需要使用asm目录里面的头文件,而不是asm-x86_64里面的。
cd ..
rm -rf linux-2.4.23
unset CFLAGS
注意我们前面通过设置CFLAGS关闭了glibc,现在是时候重新把它打开了。

tar xjvf glibc-2.3.1.tar.bz2
解开源码包
cd glibc-2.3.1
tar xjvf glibc-linuxthreads-2.3.1.tar.bz2
解开linux线程支持源码包
patch -Np1 -i ../glibc-2.3.2-sscanf-1.patch
打上补丁,该补丁可在LFS5.0官方下载目录找到。
mkdir ../glibc-build
cd ../glibc-build
创建构建目录
echo 'BUILD_CC=gcc' > configparms
echo 'CC=x86_64-unknown-linux-gcc' >> configparms
为了进行交叉编译,需要设置configparms文件,指定当生成宿主机代码(例如用于测试宿主环境的配置命令)时采用gcc(宿主机上的)进行编译,而生成目标代码时采用我们前面构建的交叉编译器编译。
../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
安装于/opt/x86-64,头文件放在/opt/x86-64/x86_64-unknown-linux/include,不用CVS,运行内核2.4(我用2.6),允许插件(前面那个linux线程支持就是一个插件),关闭profile,构建环境i686,目标环境x86-64
make -j4
make就可以了。
make install
cd ..
rm -rf glibc-2.3.1/ glibc-build/

千辛万苦,终于得到了一个交叉编译环境。有条件的朋友不妨照着做一遍,看看会遇到什么问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-1 19:00:11 | 显示全部楼层
实战评述:构建x86_64内核

在iBox硬盘版的平台上,在前面完成的交叉编译工具链的基础上,我开始构建64位版的Linux内核。
因为原文对于要注意的事项已经交待得非常全面,所以我没什么可说的。要说的一点,就是Makefile比较大,要是直接找的话会比较难,最好先用grep找到那些行,再来修改ARCH和CROSS_COMPILD。

我没怎么优化这个内核,只是改成了不带模块支持,然后将一些必要的驱动加了进去:SATA驱动、声卡驱动(我打算一边放歌一边装)、FrameBuffer驱动(其实这个非必要)、PPPoE驱动(用来上网,写帖子)、VFAT驱动等(我把那些安装包全放在FAT分区里,该区装的是FreeDOS,哈哈)。

启动过程比较顺利,现在这文章就是在新内核下面写的。
回复 支持 反对

使用道具 举报

发表于 2005-4-2 18:11:09 | 显示全部楼层
赞一个!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-2 21:52:09 | 显示全部楼层
实战评述:构建临时的构建系统

如果你对LFS的认识比较深入,你就会明白,第5章的目的是搭建一个用于适合于构建各种组件的平台,以便在第6章 chroot 进去完成真正的基本系统搭建。因此,这里面选择的组件都是与构建过程相关的,都属于开发包。

而工具链,则是binutils+gcc+linux headers+glibc,它们是编译软件所必须的。
binutils: 负责最终生成二进制文件
gcc: 负责将源代码编译成供binutils使用的二进制格式
linux header: 提供Linux系统的基本API接口
glibc: 负责实现基本的系统服务
可以说,任何开发工具都必须具备这4个部分,才能构成一个软件开发平台。

经过了前面的步骤,我们现在已经有了一个用于交叉编译的工具链。这个工具链的所有可执行文件都是32位的,但是库文件则编译为64位,而且生成的代码都是64位的。由于内核是由它交叉编译生成的,因此是64位的。这个内核具备32位的兼容性,因此重新启动之后,32位的交叉编译工具链和其它32位系统软件可以如常运行。这是这一章工作的基础。

首先,完成基本的LFS步骤,分区、添加用户,添加mount。

su - lfs以lfs用户开始工作。

请大家首先看清楚原文的步骤描述。首先的工作,调整PATH和/tools/lib目录创建,/tools/lib64软链接等等都必须完成。
1、编译binutils第一次。这次生成的是64位的binutils,安装在/tools(软链接到/mnt/lfs/tools)下。我采用的是最新的binutils 2.15.94.0.2.2。
2、编译gcc第一次。请注意,原文这里没有--disable-multilib配置参数,但经过试验,缺乏这个参数的话,如果正确调整了/tools/lib64软链接,那么后面的glibc无法正确编译。不调整软链接的话,glibc可以通过,但会生成一个/tools/lib64目录。而后面编译的时候会暴露出其代码的一个bug,同时这个bug也显示出所构建的工具链是有缺陷的。后面到tcl的时候我会再次提到它。我所安装的是gcc 3.4.3版本。bootstrap的时候,实际上编译了3次。第一次用交叉编译器编译,出来64位代码,但是是旧版(3.2.3)生成的。第二次使用第一次的结果编译,出来的是新版生成的代码。第三次使用第二次的结果编译,理论上应当跟第二次的结果相同,因此可用于校验编译器的完整性。到了这里,我们的编译器有了原生64位(本身是64位,生成64位)的支持了。
3、安装linux头文件。按照LFS BOOK 6.0的说法,现在建议直接下载头文件包进行安装,不建议使用linux内核拷贝头文件的方法。我采用了这个方法,安装的是linux-libc headers 2.6.11.2。
注意,采用这个方法不需拷贝asm-generic目录。只需按照LFS BOOK拷贝asm-x86_64和linux两个目录即可(BOOK里面是asm-i386)。
4、编译glibc。这将生成一个64位的glibc库。我采用2.3.4的版本。
5、调整工具链。这是LFS 5.0的重大进步,现在无需为了保证所有组件在chroot环境下正确运行而将第5章的所有工具静态编译了。由于gcc中的spec文件指定了动态链接加载器的位置,所以只要修改了它,则后面编译的所有组件都会使用新的动态链接加载器。LFS中通过一个sed脚本进行修改。在32-64提升过程中,由于动态链接加载器的位置有所改变,因此要修改的内容有所不同,大家只要按照前面的原文去做就可以了。做完之后,记得通过LFS BOOK里面提供的方法检验一下是否修改成功。但要注意,由于是64位环境,出来的检验结果会有所不同。
6、Tcl、expect 、Dejadnu,这是3个测试用的组件。在重新构建工具链之前,需要先构建这三个组件。其中要说明的, 是Tcl的当前版本有Bug,但不会总是发生。
问题出在Tcl8.4.9的compat/strstr.c文件和compat/strnod.c文件。前一个,没有任何头文件和宏定义,却有一个retuen NULL语句。这显然是错误。修改的办法,是在文件前面加上"#define NULL 0"。后一个,因为开发者要处理一个特殊的软件配置问题,因此另外写了一个 fixstrnod.c文件。然后,让autoconfig自动生成了一个宏定义,当检测出特殊的问题存在时就增加编译参数-Dstrnod=fixstrnod。这样当然很好,但有一个问题,就是strnod.c里面的strnod()函数也被此宏定义修改了。因此,应该在此文件前面添加"#unset strnod"以便去掉该宏定义。
一般来说,你不会遇到这里所描述的问题。我也是在一个特殊情形下遇到的,那就是我首次进行的时候忘记了建立/lib64链接。然后正常进行到这里。这时autoconf检测出我的工具链存在重大问题,因此试图使用compat下面的代替品替代系统函数。这时候这两个Bug便暴露了。
我已经为此编写了补丁。但在我的系统上可以不用,因为正确配置的工具链不会导致这两个Bug的暴露。同时,我已经向Tcl开发组提交了Bug报告。

好了,现在要重新编译工具链的组件了,本文先写到这里。附件是我做的Tcl补丁,供参考。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表