LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: 地球发动机

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

[复制链接]
发表于 2005-4-2 22:58:26 | 显示全部楼层
Post by hongfeng
好,继续。兄弟加油!!
呵呵,等我有钱了我买俩个AMD64,一个用来编译LFS,一个用来在旁边煎鸡蛋。

现在的AMD没法煎鸡蛋了,我的A64 3200+ 才25度
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-2 23:27:39 | 显示全部楼层
实战评述:构建临时的构建系统(续)
后面的过程基本上没什么可说的,照着BOOK上去做就是了。连原文也没什么注释可加,呵呵。

现在,我已经成功来到第6章的开头。
-------------------------------------------------------------------------------------------------------------------------------
已安装在临时系统的组件:
1、Binutils-2.15.94.0.2.2
2、Gcc-3.4.3
3、Linux-Libc-Headers-2.6.11.2
4、Glibc-2.3.4
5、Tcl-8.4.9
6、Expect-5.43.0
7、DejaGNU-1.4.4
8、Gawk-3.1.4
9、Coreutils-5.2.1
10、Bzip2-1.0.3
11、Gzip-1.3.5
12、Diffutils-2.8.1
13、Findutils-4.2.20
14、Make-3.80
15、Grep-2.5.1
16、Sed-2.1.4
17、Gettext-0.14.3
18、Ncurses-5.4
19、Patch-2.5.4
20、Tar-1.15.1
21、Texinfo-4.8
22、Bash-3.0
23、M4-1.4.2
24、Bison-2.0
25、Flex-2.5.31
26、Util-linux-2.12g
27、Perl-5.8.6

经过stripping之后,所占用的磁盘空间为192,828KB。
这些文件是我大约半个月前收集的。现在,M4已经推出了新版本1.4.3,Grep也有了新版本2.5.1a。但我现在还没用上。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-5 23:47:33 | 显示全部楼层
实战评述:LFS 5.0跟6.0分别很大。但原作者的基本原则是正确的。

以下是我做LFS6.1的过程。
最重要的一点,就是大多数的包都要尽量带上--libdir=/usr/lib64参数。

# 6.9 linux-headers-2.6.11.2

cp -R include/asm-x86_64 /usr/include/asm
cp -R include/linux /usr/include

chown -R root:root /usr/include/{asm,linux}

find /usr/include/{asm,linux} -type d -exec chmod 755 {} \;
find /usr/include/{asm,linux} -type f -exec chmod 644 {} \;

# 6.10 Man-pages-2.01
make install

# 6.11 Glibc-2.3.4
touch /etc/ld.so.conf
mkdir ../glibc-build
cd ../glibc-build
../glibc-2.3.4/configure --prefix=/usr \
    --disable-profile --enable-add-ons \
    --libexecdir=/usr/lib64/glibc --enable-kernel-2.6.0
make
make check
make install
make localedata/install-locales
make -C ../glibc-2.3.4/linuxthreads/man
make -C ../glibc-2.3.4/linuxthreads/man install

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

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

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

# End /etc/nsswitch.conf
EOF

tzselect

cp --remove-destination /usr/share/zoneinfo/Asia/Hong_Kong \
    /etc/localtime
cat > /etc/ld.so.conf << "EOF
# Begin /etc/ld.so.conf

/usr/local/lib64
/opt/lib64
/usr/local/lib
/opt/lib

# End /etc/ld.so.conf
EOF

# 6.12 重新调整工具链
在binutils-build目录下运行
make -C ld INSTALL=/tools/bin/install install
perl -pi -e 's@ /tools/lib/ld-linux.so.2@ /lib/ld-linux.so.2@g;' \
    -e 's@ /tools/lib64/ld-linux-x86-64.so.2@ /lib64/ld-linux-x86-64.so.2@g;' \
    `gcc --print-file specs`
(如果加上了原书中的另一条替换命令,就会不能编译后面的dummy.c)
    echo 'main(){}' > dummy.c
    cc dummy.c
    readelf -l a.out | grep ': /lib'
检查结果:应当是
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
    rm dummy.c a.out

# 6.13 Binutils-2.15.94.0.2.2
mkdir ../binutils-build
cd ../binutils-build
../binutils-2.15.94.0.2.2/configure --prefix=/usr \
   --enable-shared --libdir=/usr/lib64   
make tooldir=/dir
make check
make tooldir=/usr install
cp ../binutils-2.15.94.0.2.2/include/libiberty.h /usr/include

#6.14 GCC-3.4.3
patch -Np1 -i ../gcc-3.4.3-no_fixincludes-1.patch
patch -Np1 -i ../gcc-3.4.3-linkonce-1.patch
mkdir ../gcc-build
cd ../gcc-build
../gcc-3.4.3/configure --prefix=/usr \
    --libexecdir=/usr/lib64 --libdir=/usr/lib64 \
    --enable-shared --enable-threads=posix \
    --enable-__cxa_atexit --enable-clocale=gnu \
    --enable-languages=c,c++ --disable-multilib
make
make -k check
make install
ln -s ../usr/bin/cpp /lib
ln -s gcc /usr/bin/cc

# 6.15 Coreutils-5.2.1
patch -Np1 -i ../coreutils-5.2.1-uname-2.patch
patch -Np1 -i
   ../coreutils-5.2.1-suppress_uptime_kill_su-1.patch
DEFAULT_POSIX2_VERSION=199209 ./configure --prefix=/usr \
   --libdir=/usr/lib64
make
make NON_ROOT_USERNAME=dummy check-root
src/su dummy -c "make RUN_EXPENSIVE_TESTS=yes check"
sed -i '/dummy/d' /etc/passwd /etc/group
make install
mv /usr/bin/{[,basename,cat,chgrp,chmod,chown,cp,dd,df} /bin
mv /usr/bin/{date,echo,false,head,hostname,install,ln} /bin
mv /usr/bin/{ls,mkdir,mknod,mv,pwd,rm,rmdir,sync} /bin
mv /usr/bin/{sleep,stty,test,touch,true,uname} /bin
mv /usr/bin/chroot /usr/sbin
ln -s ../../bin/install /usr/bin

# 6.16 Zlib-1.2.2
./configure --prefix=/usr --libdir=/usr/lib64 --shared
make
make check
make install
rm /lib/libz.so
ln -sf ../../lib64/libz.so.1.2.2 /usr/lib/libz.so
make clean
./configure --libdir=/usr/lib64 --prefix=/usr
make
make check
make install
chmod 644 /usr/lib/libz.a

# 6.17 Mktemp-1.5
patch -Np1 -i ../mktemp-1.5-add_tempfile-1.patch
./configure --prefix=/usr --with-libc --libdir=/usr/lib64
make
make install
make install-tempfile

# 6.18 lana-Etc-1.04
make
make install

# 6.19 findutils-4.2.20
./configure --prefix=/usr --libexecdir=/usr/lib64/locale \
   --libdir=/usr/lib64 --localstatedir=/var/lib/locate
make
make check
make install

# 6.20 Gawk-3.1.4
./configure --prefix=/usr --libexecdir=/usr/lib64 --libdir=/usr/lib64
make
make check
make install

# 6.21 Ncurses-5.4
./configure --prefix=/usr --libdir=/usr/lib64 \
   --with-shared --without-debug
make
make install
chmod 755 /usr/lib64/*.5.4
chmod 644 /usr/lib64/libncurses++.a
mv /usr/lib64/libncurses.so.5 /lib64
ln -sf ../../lib64/libncurses.so.5 /usr/lib64/libncurses.so
ln -sf libncurses.so /usr/lib64/libcurses.so

# 6.22 Readline-5.0
patch -Np1 -i ../readline-5.0 -fixes-1.patch
./configure --prefix=/usr --libdir=/lib64
make SHLIB_XLDFLAGS=-lncurses
make install
chmod 755 /lib64/lib{readline,history}.so*
mv /lib64/lib{readline,history}.a /usr/lib64
rm /lib64/lib{readline,history}.so
ln -sf ../../lib64/libreadline.so.5 /usr/lib64/libreadline.so
ln -sf ../../lib/libhistory.so.5 /usr/lib64/libhistory.so

# 6.23 Vim-6.3
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
echo '#define SYS_GVIMRC_FILE "/etc/gvimrc"' >> src/feature.h
patch -Np1 0i ../vim-6.3-security_fix-1.patch
./configure --prefix=/usr --libdir=/usr/lib64 --enable-multibyte
make
make install
ln -s vim /usr/bin/vi

cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc

set nocompatible
set backspace=2
syntax on
if (&term == "iterm") || (&term == "putty")
  set background=dark
endif

" End /etc/vimrc
EOF

# 6.24 M4-1.4.3
./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

# 6.25 Bison-2.0
./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

# 6.26 Less-382
./configure --prefix=/usr --bindir=/bin --sysconfdir=/etc \
   --libdir=/lib64
make
make install

# 6.27 Groff-1.19.1
PAGE=A4 ./configure=/usr --libdir=/usr/lib64
make
install
ln -s soelim /usr/bin/zsoelim
ln -s eqn /usr/bin/geqn
ln -s tbl /usr/bin/gtbl

# 6.28 Sed-4.1.4
./configure --prefix=/usr --bindir=/bin --libdir=/usr/lib64
make
make check
make install

# 6.29 Flex-2.5.31
patch -Np1 -i ../flex-2.5.31-debian_fixes-2.patch
touch doc/flex.1
./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install
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

# 6.30 Gettext-0.14.3
./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

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

# 6.32 IPRoute2-2.6.11
patch -Np1 -i ../iproute2-2.6.11_050330-remove_db-1.patch
./configure --libdir=/usr/lib64
make SBINDIR=/sbin
make SBINDIR=/sbin install

# 6.33 Perl-5.8.6
./Configure
自己输入选项,遇到Lib就用Lib64代替。下面列出需要调整的选项。
...
Directories to use for library searches? [/usr/local/lib /lib /usr/lib] /usr/local/lib64 /lib64 /usr/lib64
...
Installation prefix to use? (~name ok) [/usr/local] /usr
...
What installation prefix should I use for installing files? (~name ok)
[/usr]
...
Pathname where the private library files will reside? (~name ok)
[/usr/lib/perl5/5.8.6] /usr/lib64/perl5/5.8.6
...
Pathname for the site-specific library files? (~name ok)
[/usr/lib/perl5/site_perl/5.8.6] /usr/lib64/perl5/site_perl/5.8.6
...
Pathname for the site-specific architecture-dependent library files? (~name ok)
[/usr/lib/perl5/site_perl/5.8.6/x86_64-linux] /usr/lib64/perl5/site_perl/5.8.6/x86_64-linux
...
配置选项比较多,我都是全部回车通过的。

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

# 6.34 Texinfo-4.8
./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install
make TEXMF=/usr/share/texmf install-tex
cd /usr/share/info
rm dir
for f in *
do install-info $f dir 2>/dev/null
done

# 6.35 Autoconf-2.59
./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

# 6.36 Autoimake-1.9.5
./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

# 6.37 Bash-3.0
patch -Np1 -i ../bash-3.0-fixes-3.patch
patch -Np1 -i ../bash-3.0-avoid-WCONTINUED-1.patch
./configure --prefix=/usr --libdir=/usr/lib64 --bindir=/bin \
   --without-bash-malloc --with-installed-readline
make
make tests
make install
exec /bin/bash --login +h

# 6.38 File-4.13
./configure --prefix=/usr --libdir=/usr/lib64
make
make install

# 6.39 Libtool-1.5.14
./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

# 6.40 Bzip2-1.0.3
make -f Makefile-libbz2_so
make clean
make
make test
make install

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

# 6.41 Diffutils-2.8.1
./configure --prefix=/usr --libdir=/usb/lib64
make
make install

# 6.42 Kbd-1.12
./configure
make
make install

# 6.43 E2fsprogs-1.37
sed -i -e 's/-DTEST/$(ALL_CFLAGS) &/' lib/e2p/Makefile.in
mkdir ../build
cd ../build
../e2fsprogs-1.37/configure --prefix=/usr --with-root-prefix="" \
    --libdir=/usr/lib64 --enable-elf-shlibs --disable-evms
make
make check
make install

# 6.44 Grep-2.5.1a
./configure --prefix=/usr --libdir=/usr/lib64 --bindir=/bin \
   --with-included-regex
make
make check
make install

# 6.45 Grub-0.96
(跳过)

# 6.46 Gzip-1.3.5
./configure --prefix=/usr --libdir=/usr/lib64
sed -i 's@"BINDIR"@/bin@g' 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

# 6.47 Hotplug-2004_09_23
make install
cp etc/hotplug/pnp.distmap /etc/hotplug
rm -rf /etc/init.d
rm -rf /etc/hotplug/net.agent
touch /var/log/hotplug/events
mkdir /lib/firmware

# 6.48 Man-1.5p
sed -i 's@-is@&R@g' configure
sed -i 's@MANPATH./usr/man@#&@g' src/man.conf.in
./configure -confdir=/etc
make
make install

# 6.49 Make-3.80
./configure --prefix=/usr --libdir=/usr/lib64
make
make check
make install

# 6.50 Module-Init-Tools-3.1
./configure --prefix="" --enable-zlib --libdir=/usr/lib64
make DOCBOOKTOMAN=""
make check
make install

# 6.51 Patch-2.5.4
CPPFLAGS=-D_GNU_SOURCE ./configure --prefix=/usr --libdir=usr/lib64
make
make install

# 6.52 Procps
make
make install

# 6.53 Psmisc-21.6
./configure --prefix=/usr --exec-prefix="" --libdir=/usr/lib64
make
make install
mv /bin/pstree* /usr/bin
ln -s killall /bin/pidof

# 6.54 Shadow-4.0.7
patch -Np1 -i ../shadow-4.0.7-fix_lastlog-1.patch
./configure --libdir=/lib64 --enable-shared
sed -i 's/groups$(EXEEXT) //' src/Makefile
sed -i '/groups/d' man/Makefile
cp etc/{limits,login.access} /etc
sed -e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' \
    -e 's@/var/spool/mail@/var/mail@' \
    etc/login.defs.linux > /etc/login.defs
mv /usr/bin/passwd /bin
mv /lib64/libshadow.*a /usr/lib
rm /lib/libshadow.so
ln -sf ../../lib/libshadow.so.0 /usr/lib/libshadow.so
mkdir /etc/default

pwconv
grpconv
passwd root

# Sysklogd-1.4.1
patch -Np1 -i ../sysklogd-1.4.1-fixes-1.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/usr.log
*.emerg *

# log the bootscript outpug:
local2.* -var/log/boot.log

# End /etc/syslog.conf
EOF

# 6.56 Sysinit-2.86
sed -i 's@Sending processes@& started by init@g' src/init.c
为了通过编译,我加了一句
sed -i 's@/usr/lib/@/usr/lib64/@g' src/Makefile

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 -I '\033(K' tty1 9600
2:2345:respawn:/sbin/agetty -I '\033(K' tty2 9600
3:2345:respawn:/sbin/agetty -I '\033(K' tty3 9600
4:2345:respawn:/sbin/agetty -I '\033(K' tty4 9600
5:2345:respawn:/sbin/agetty -I '\033(K' tty5 9600
6:2345:respawn:/sbin/agetty -I '\033(K' tty6 9600

# End /etc/inittab

# 6.57 Tar-1.15.1
patch -Np1 -i ../tar-1.15.1-sparse_fix-1.patch
./configure --prefix=/usr --bindir=/bin --libexecdir=/usr/sbin \
     --libdir=/usr/lib64
make
make check
make install

# 6.58 Udev-056
make udevdir=/dev
make test
出现一个错误,但是是期望中的,也就是正常。
make udevdir=/dev install

# 6.59 Util-linux-2.12q
sed -i 's@etc/adjtime@var/lib/hwclock/adjtime@g' \
   hwclock/hwclock.c
mkdir /var/lib/hwclock
patch -Np1 -i ../util-linux-2.12q-cramfs-1.patch
./configure
make HAVE_KILL=yes HAVE_SLN=yes
make HAVE_KILL=yes HAVE_SLN=yes install
mv /usr/bin/logger /bin

好了,到此第6章全部完成,剩下一些清理工作了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-20 02:10:33 | 显示全部楼层
现在,我们应该构建32位兼容的glibc了。不过,由于原文的描述有一些问题,我一直无法成功。于是通过修改主系统原有的GRUB将新系统起动起来,把BLFS装上了,然后再来研究。

32位兼容的工具链的构造是相当复杂的。

第一步,交叉编译工具链
export ORIG_PATH=$PATH
export PATH=/tc-stage1/bin:/tc-stage0/binORIG_PATH
ln -s /tc-stage0/lib /lib
set +h
保存PATH环境变量,并将构建过程的两个目录加到PATH中去。

binutils-2.14, 第一次

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
make install
这里,是在64位环境下构建能处理32位代码的binutils。--target参数指明了这一点。也可以仿照LFS BOOKS所述,加上--disable-nls参数。这里生成的文件(以as为例)均形如i686-pc-linux-gnu-as

为调整工具链准备ld,但暂时不安装。
make -C ld clean
make -C ld LIB_PATH=/tc-stage0/i686-pc-linux-gnu/lib:/tc-stage0/lib

gcc-3.2.3, 第一步

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
make install
unset CFLAGS
这里,是用上面构建好的binutils和宿主64位的编译器来生成交叉编译器。可能有人感到奇怪,为什么这里--host和--target都是32位?宿主是64位呀。其实,--host的作用是要求编译过程采用i686-pc-linux-gnu-as等工具(我们刚刚构建好的那个),而不是as等。

linux-libc-headers

mkdir -p /tc-stage0/include
cp -r include/linux/ include/asm-i386/ /tc-stage0/include
ln -s asm-i386 /tc-stage0/include/asm
准备好头文件,以便构建32位的glibc

glibc-2.3.1, stage 0

patch -Np1 -i../glibc-2.3.2-sscanf-1.patch
tar xjvf ../glibc-linuxthreads-2.3.1.tar.bz2
cd linuxthreads
patch -Np1 -i ../glibc-linuxthreads-2.3.1-useldt-1.patch
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
这里,大家可以看到,有--build参数表明在64位下编译了。这个参数和--host参数一起,表明我们正在生成交叉编译的glibc。在这一步,我遇到不少问题,要做一些补丁才能解决问题。请看附件。

调整工具链。第一次
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}

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2005-11-10 10:12:31 | 显示全部楼层
楼主真乃神人!!1
回复 支持 反对

使用道具 举报

发表于 2006-8-23 22:45:16 | 显示全部楼层
Post by lilyerr
楼主真乃神人!!1

严重同意
回复 支持 反对

使用道具 举报

发表于 2006-9-23 11:50:43 | 显示全部楼层
Post by hongfeng
好,继续。兄弟加油!!
呵呵,等我有钱了我买俩个AMD64,一个用来编译LFS,一个用来在旁边煎鸡蛋。


这个大概要换用奔腾D或赛扬D,才有可能煎鸡蛋。你的看法还停留在六年前。
回复 支持 反对

使用道具 举报

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

本版积分规则

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