LinuxSir.cn,穿越时空的Linuxsir!

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

[原创]用源代码制作64位Linux系统

[复制链接]
发表于 2009-10-3 15:17:25 | 显示全部楼层 |阅读模式
用源代码制作64位Linux系统

(本地编译版本)1.0 正式版

作者:孙海勇





更新日志:

  2009年10月3日(中秋节):1.0 正式版发布



目录

  • 前言
  • 更新
  • 相关知识

    • 制作原理
    • pushd和popd
    • tar的使用

  • 准备工作
  • 下载

    • 软件包下载
    • 补丁下载

  • 建立目标系统目录结构
  • 制作预工具链

    • Binutils
    • GCC(仅支持C语言)
    • 制作工具链环境

      • 内核头文件(Linux-Header)
      • 工具链环境的glibc/eglibc
      • 工具链的Binutils
      • 工具链的GCC(支持c和c++语言)
      • ncurses
      • bash
      • Bzip2
      • Coreutils
      • Diffutils
      • Findutils
      • Gawk
      • Gettext
      • Grep
      • Gzip
      • M4
      • Make
      • Patch
      • Perl
      • Sed
      • Tar
      • Texinfo
      • e2fsprogs
      • Util-linux-ng
      • XZ Utils
      • 清理工具链

    • 制作目标系统

      • 环境设置
      • 建立目标系统目录结构
      • 创建必要的用户、组和日志文件
      • Linux-Header
      • Man_Pages
      • glibc/eglibc
      • 调整工具链
      • Zlib
      • Binutils
      • Gmp
      • Mpfr
      • GCC
      • Berkeley DB
      • Sed
      • Pkg-config
      • Ncurses
      • E2fsprogs
      • Util_Linux_ng
      • Coreutils
      • Iana_Etc
      • M4
      • Bison
      • Procps
      • Grep
      • Readline
      • Bash
      • Libtool
      • Inetutils
      • Perl
      • Autoconf
      • Automake
      • Bzip2
      • Diffutils
      • File
      • Gawk
      • GDBM
      • Findutils
      • Flex
      • Gettext
      • Groff
      • Gzip
      • Iproute2
      • Kbd
      • Less
      • Make
      • Man-DB
      • Module_Init_Tools
      • Patch
      • Psmisc
      • Shadow
      • Rsysklog
      • Sysvinit
      • Tar
      • Texinfo
      • Udev
      • DHCPCD
      • Vim
      • XZ-Utils
      • bootscript
      • 编译内核
      • 清除调试信息
      • 更新系统环境

    • 新系统必要的配置文件
    • 系统的启动
    • 结束

    前言

      一般来说如果要在32位的系统上制作一个64位的系统,所使用的是交叉编译的方法,本文试图创造一种方法可以在32位的系统上不使用交叉编译的方法来制作一套纯64位的系统。
      因为本文所建立的方法没有采用交叉编译,因此对于制作机器的要求必须是32和64位兼容支持的,比如现在常见的x86_64的机器。
      本文将采用x86_64来制作,但该方法并不局限于x86_64,其可以用于制作任何32位和64位相兼容的CPU架构,比如龙芯2。
      本文可以使用eglibc来代替glibc,eglibc是一个和glibc高度兼容的C库,其编译方法也是一样的,因此文中采用的glibc的编译方法同样适合用在eglibc上。
  由于排版问题,建议直接使用下面的地址来查看或者到我的blog:youbest.cublog.cn上看最新版本。


  http://zdbr.net.cn/download/x86_64_pure-1.0.html
 楼主| 发表于 2009-10-3 15:20:01 | 显示全部楼层
本文是在一个32位的系统上不采用交叉编译的方法制作一个在同一台机器上运行的纯64位的系统。
回复 支持 反对

使用道具 举报

发表于 2009-10-3 15:27:25 | 显示全部楼层
呵呵,新作出炉,搬凳看~~
回复 支持 反对

使用道具 举报

发表于 2009-10-3 15:41:20 | 显示全部楼层
大略过一遍,比偶原来想象的更简单,从形式上确实看不出使用了交叉编译。

此种特殊情况,安装内核头文件时,ARCH=x86_64 可省略;
linux-kernel Makefile 中设置 ARCH 部分可正常工作。


为方便讨论,我们使用下面严格定义。
系统架构,根文件系统对应的系统类型,以 gcc -v 或 bash $MACHTYPE 结果为准,chroot 子系统类推。
交叉编译,有系统架构迁移发生的编译过程。
本地编译,无系统架构迁移发生的编译过程。
交叉编译方式,交叉编译一软件包,且配置过程显式指明 target host build 参数。

就像之前偶帖子中偶提到的,这种方法工具链部分仍是交叉编译生成,只是形式上是隐式的。
执行 configure 时 target host build 的输出也会谎报军情,如果换用低版本 binutils gcc 情况则会不同。
低版本 binutils gcc 源码树中包含的 autotools 版本较低,config.guess 给出的 host build 结果会不同。
此种特殊情况,临时系统事实上也是交叉编译生成。

这种方法,适用范围有些窄,个人还是喜欢用 更一般化、显式的传统交叉编译方法 构建 临时系统,之后启动临时系统本地编译完成基本系统。

PS:
此种特殊情况,系统可靠性无大问题,但宿主工具链可靠性值得怀疑;
个人在这种情况下,更愿意用 setarch 或 简单的用 linux32 包装 shell,隔离一个真正的 32bit 环境,此时 uname 结果是个人期望的,不过那样这种方法也就失效了。
回复 支持 反对

使用道具 举报

发表于 2009-10-3 16:30:33 | 显示全部楼层
还没想过,这样也行,一定要好好学习下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-4 12:46:23 | 显示全部楼层
Post by 聚焦深空;2032672
大略过一遍,比偶原来想象的更简单,从形式上确实看不出使用了交叉编译。

此种特殊情况,安装内核头文件时,ARCH=x86_64 可省略;
linux-kernel Makefile 中设置 ARCH 部分可正常工作。


为方便讨论,我们使用下面严格定义。
系统架构,根文件系统对应的系统类型,以 gcc -v 或 bash $MACHTYPE 结果为准,chroot 子系统类推。
交叉编译,有系统架构迁移发生的编译过程。
本地编译,无系统架构迁移发生的编译过程。
交叉编译方式,交叉编译一软件包,且配置过程显式指明 target host build 参数。

就像之前偶帖子中偶提到的,这种方法工具链部分仍是交叉编译生成,只是形式上是隐式的。
执行 configure 时 target host build 的输出也会谎报军情,如果换用低版本 binutils gcc 情况则会不同。
低版本 binutils gcc 源码树中包含的 autotools 版本较低,config.guess 给出的 host build 结果会不同。
此种特殊情况,临时系统事实上也是交叉编译生成。

这种方法,适用范围有些窄,个人还是喜欢用 更一般化、显式的传统交叉编译方法 构建 临时系统,之后启动临时系统本地编译完成基本系统。

PS:
此种特殊情况,系统可靠性无大问题,但宿主工具链可靠性值得怀疑;
个人在这种情况下,更愿意用 setarch 或 简单的用 linux32 包装 shell,隔离一个真正的 32bit 环境,此时 uname 结果是个人期望的,不过那样这种方法也就失效了。


所以我之前说是否交叉编译要看个人对交叉编译的理解了。

我无法说服你对交叉编译的理解,不过我可以说一下为什么我认为没有进行交叉编译:
  我对于是否进行了交叉编译是以编译器的角度来看待的,在这篇文章采用的方法中每一步对于编译器来说都是按照本地编译的方式进行,并没有你所说的隐式的交叉编译,我们可以从编译器对于是否交叉编译的判断就可以看出来,build、host和target在整个编译过程中都没有发生变化并且也是保持一致的,因此我从这个角度来说明整个编译过程没有采用交叉编译。
      低版本我的确没有去测试过,不过既然是低版本我们是否就可以不再去探讨了?
  至于适用范围,我在文章的一开始也说了只能用于同一台机器兼容的指令之间进行。这个方法我在x86_64和龙芯2的CPU上都验证通过了。

对于是否交叉编译可能不同的人理解会不太一样,不过我很欢迎就这个问题的讨论,如果有争论我这篇文章也没白写!
回复 支持 反对

使用道具 举报

发表于 2009-10-4 13:42:27 | 显示全部楼层
确实是和对本地编译的定义有关。
不妨称您使用的 本地编译定义 为 广义本地编译;
偶坚持的 本地编译定义 为 狭义本地编译。:flash:
回复 支持 反对

使用道具 举报

发表于 2009-10-6 22:55:45 | 显示全部楼层
工具链的GCC(支持c和c++语言)
tar xvf ${DOWNLOADDIR}/gcc-4.4.1.tar.bz2 -C ${BUILDDIR}
pushd ${BUILDDIR}/gcc-4.4.1
        tar xvf ${DOWNLOADDIR}/gmp-4.3.1.tar.bz2
        mv gmp-4.3.1 gmp
        tar xvf ${DOWNLOADDIR}/mpfr-2.4.1.tar.bz2
        mv mpfr-2.4.1 mpfr
        cd mpfr
        patch -Np1 -i ${DOWNLOADDIR}/mpfr-2.4.1-branch_update-1.patch
        cd ..
        patch -Np1 -i ${DOWNLOADDIR}/gcc-4.4.1-pure64-specs-1.patch
        patch -Np1 -i ${DOWNLOADDIR}/gcc-4.4.1-tools-1.patch
        mkdir -pv ../gcc-build
        cd ../gcc-build
        ../gcc-4.4.1/configure \
                 --prefix=/tools --disable-multilib \
                 --libexecdir=/tools/lib --with-local-prefix=/tools \
                 --enable-long-long --enable-c99 --enable-shared \
                 --enable-threads=posix --disable-nls \
                 --enable-__cxa_atexit --enable-languages=c,c++ \
                 --disable-libstdcxx-pch --disable-bootstrap
        make
        make install
        ln -s gcc /tools/bin/cc
        cd ..
        rm -r gcc-build
        rm -r gcc-4.4.1
popd
----------------
文中的       
make install
        ln -s gcc /tools/bin/cc
        cd ..
gcc 位于何方?make install后的路径应该gcc-build目录下,并没有gcc,该目录也随后删除。
类似的,有网友也在(第103贴)
http://www.linuxsir.cn/bbs/thread322894-7.html
提出了疑问。
-------------------
明白了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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