[原创]用源代码制作64位Linux系统
时间:2009-10-03
来源:互联网
(本地编译版本)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上。
作者: youbest 发布时间: 2009-10-03
作者: youbest 发布时间: 2009-10-03
作者: d00m3d 发布时间: 2009-10-03
此种特殊情况,安装内核头文件时,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-03
作者: tlze 发布时间: 2009-10-03
作者: 聚焦深空
大略过一遍,比偶原来想象的更简单,从形式上确实看不出使用了交叉编译。
此种特殊情况,安装内核头文件时,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上都验证通过了。
对于是否交叉编译可能不同的人理解会不太一样,不过我很欢迎就这个问题的讨论,如果有争论我这篇文章也没白写!

作者: youbest 发布时间: 2009-10-04
不妨称您使用的 本地编译定义 为 广义本地编译;
偶坚持的 本地编译定义 为 狭义本地编译。

作者: 聚焦深空 发布时间: 2009-10-04
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.org/bbs/thread322894-7.html
提出了疑问。
-------------------
明白了。
作者: zswlb9999 发布时间: 2009-10-07
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28