LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 7830|回复: 26

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

[复制链接]
发表于 2005-3-31 01:39:25 | 显示全部楼层 |阅读模式
很幸运Google到这样一个网页
http://home.ix.netcom.com/~ejohns/glfs-amd64/

所以,现在终于可以开始着手从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交叉编译工具链

===========================================================

不知不觉,已经1点半过了,还是Sleep吧,明天继续。
 楼主| 发表于 2005-3-31 09:43:38 | 显示全部楼层
白天要上班,所以以翻译为主
===================》原文翻译《===========================
构建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应当没问题。我晚上将着手构建一个工具链,将尝试使用最新的稳定版本来进行。大家拭目以待。

2003-03-31 23:21
经过一晚上的折腾,终于确认一个事实:上面那个帖子说:“我从未在Glibc 2.3.1以上的版本交叉编译成功过”至少直到2.3.4版本都是真的。大家千万就不要不信这个邪,浪费时间了。当然,如果出了2.3.5或更高版本,那是另外一回事。
另一点非常重要的是,比较新的内核头文件多了一个asm-generic目录,以上拷贝内核头文件的指令应当改成
cp -r include/linux/ include/asm-x86_64/ \
include/asm-generic /opt/x86-64/x86_64-unknown-linux/include
多拷贝一个目录过去。否则的话,后面Glibc也是不能编译成功的。原因是asm目录下的头文件需要引用asm-generic目录下的文件。

2004-01-01
最后要告诉大家,直到gcc-3.4.3为止,所有高于3.2.3的gcc均不能完成交叉编译。我已经完成了整个过程,在第16楼有详细评述,请看那里。
回复 支持 反对

使用道具 举报

发表于 2005-3-31 10:22:55 | 显示全部楼层
好,继续。兄弟加油!!
呵呵,等我有钱了我买俩个AMD64,一个用来编译LFS,一个用来在旁边煎鸡蛋。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-31 10:39:15 | 显示全部楼层
===================》原文翻译《===========================
构建x86_64内核

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

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

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

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

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

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

下一步:构建临时的构建系统
======================================================
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-31 10:48:58 | 显示全部楼层
Post by hongfeng
好,继续。兄弟加油!!
呵呵,等我有钱了我买俩个AMD64,一个用来编译LFS,一个用来在旁边煎鸡蛋。


这位小兄弟似乎对AMD有很深的成见啊。

现在斗转星移,时移世易,发热量大、适合煎鸡蛋的似乎是Intel的CPU啊。上次在电脑城看见一巨型风扇,一问原来是For Intel的。

相反,AMD现在已经在散热方面做得很好了。我的机器折腾Gentoo、LFS的时候就从来没有死机的!可以说是超级稳定!当然,我用的是最低档的2800+,而且没有超频,我觉得为了一点点速度牺牲稳定性不值得,毕竟我玩游戏不多。至于编译,省下那几分钟也没什么用,反倒如果系统不稳,你出错重来,花的时间远不止这个数。我不买更高档次的CPU也是这个道理,因为已经是最低档了,没人能REMARK了卖给我,并不是省那几个钱。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-31 11:38:28 | 显示全部楼层
===================》原文翻译《===========================
构建临时的构建系统

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

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

* 你必须确保在PATH中包含了交叉编译工具链,它应该位于/tools/bin之后但要在宿主机的32为工具链之前:
export PATH=/tools/bin:/opt/x86_64/x86_64-unknown-linux/binPATH
* 部分软件版本号有所不同: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
回复 支持 反对

使用道具 举报

发表于 2005-3-31 11:50:18 | 显示全部楼层
so gooooooooooooooood!!!
回复 支持 反对

使用道具 举报

发表于 2005-3-31 13:13:15 | 显示全部楼层
霍霍,现在 AMD 的 U 比 Intel 性能强,同时发热量低很多。

微软开发 x64 版本的 Windows 是用 AMD 的,所以兼容性更有保证。微软的全球技术中心也都用 Opteorn 的,这个中心是帮助客户开发软件的,也就是说,MS 的合作伙伴的软件也优先在 AMD 的 U 上测试。

Win2003 的 x64 版本推荐要求,AMD 是 1.4 GHz 的 Opteron,Intel 是 3.6 GHz 的 Xeon,1.4 GHz = 3.6 GHz,明显 Intel 不但性能不行,而且优化不足。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-31 13:29:56 | 显示全部楼层
刚刚开始做第一步:构建交叉编译工具链。

binutils2.15.94.0.2.2正常,gcc-3.4.3也编译成功了。
编译Glibc 2.3.4在运行config时就出错了,提示没有force unwind suport。正在查找资料,看能否绕过此问题。
回复 支持 反对

使用道具 举报

发表于 2005-3-31 14:53:39 | 显示全部楼层
好想要一套amd64啊,work work
只能顶先
回复 支持 反对

使用道具 举报

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

本版积分规则

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