LinuxSir.cn,穿越时空的Linuxsir!

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

bootstrap的必要性

[复制链接]
发表于 2006-3-2 21:15:10 | 显示全部楼层 |阅读模式
似乎觉得这么做有道理,但严格想起来又找不到需要bootstrap的充分的理由。因为如果第一次编译gcc时不bootstrap,似乎对以后的工作也没什么影响。难道仅仅是测试一下这个gcc能否自己编译自己吗?况且这个bootstrap使用host system的glibc来做的,到了使用自己的glibc的时候,为什么就一定能保证它第一遍自己编译自己的结果和自己一样呢?因为两个glibc可能行为不同啊。

还有,感觉按照LFS book做的tool chain还是不“纯净”,就是第一次编译binutils和gcc时带进的host的glibc的行为会对以后的一切产生影响,也就是说,如果是在两台安装不同版本glibc的机器上做LFS,最后的二进制文件有可能会不一样。

另外,有没有这样的可能,就是gcc不能完成bootstrap?也就是不管自己编译自己多少次,每次结果都不一样?
发表于 2006-3-2 21:32:01 | 显示全部楼层
没有更加 "纯净" 的方法了,再多编译几遍也没有用.

当内存 某块出错,但又没有影响到 可执行代码区,又可能出现此情况.
在 windows下, 我曾经出现过同一个文件, 3次 md5 都不一样的情况. 上天保佑,那台只能用 98 的电脑 ,已经退伍了.
回复 支持 反对

使用道具 举报

发表于 2006-3-2 21:48:31 | 显示全部楼层
bootstrap 主要目的是要摆脱 gcc 从主系统的gcc带来的影响,举例说:你准备做一个LFS-6.1.1,主系统是用gcc-3.3的

这样,就是说只用gcc-3.3来编译LFS-6.1.1的gcc-3.4.3一次,但gcc-3.3采用第一版的ABI,不做bootstrap话,你的gcc-3.4.3是仍是第一版ABI的binary。若果再做bootstrap让gcc-3.4.3去编译gcc-3.4.3的话,得出来的gcc-3.4.3就是采用第二版ABI的binary了

当然,除了ABI的分野,其他如生成的代码也有所不同
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-2 22:03:21 | 显示全部楼层
Post by d00m3d
bootstrap 主要目的是要摆脱 gcc 从主系统的gcc带来的影响,举例说:你准备做一个LFS-6.1.1,主系统是用gcc-3.3的

这样,就是说只用gcc-3.3来编译LFS-6.1.1的gcc-3.4.3一次,但gcc-3.3采用第一版的ABI,不做bootstrap话,你的gcc-3.4.3是仍是第一版ABI的binary。若果再做bootstrap让gcc-3.4.3去编译gcc-3.4.3的话,得出来的gcc-3.4.3就是采用第二版ABI的binary了

当然,除了ABI的分野,其他如生成的代码也有所不同


明白你的意思了:)

不过我们的目标应该是最终的系统,第一次编译出来的gcc本身的二进制结构并不重要,重要的是它的行为。我有一个命题,就是:凡是一个编译器能够bootstrap,那么用这个编译器的“non-bootstrap”版本和“bootstrap”版本编译出来的东西都是一样的,但我现在还没有想到怎么证明它,只是觉得很直观。如果能证明,那么bootstrap就和non-bootstrap完全一样了,也就没有bootstrap的必要了,因为总是假定gcc能够bootstrap。
回复 支持 反对

使用道具 举报

发表于 2006-3-2 22:14:13 | 显示全部楼层
Post by vanhu
凡是一个编译器能够bootstrap,那么用这个编译器的“non-bootstrap”版本和“bootstrap”版本编译出来的东西都是一样的

一样的也最多是 gcc 来编译出来的东西一样,但是 gcc 本生并不一样。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-2 22:37:05 | 显示全部楼层
Post by zlbruce
一样的也最多是 gcc 来编译出来的东西一样,但是 gcc 本生并不一样。


这就够了,因为这里讨论的gcc是第一次编译的gcc,它只是作为工具,只要从这里开始一样(是指和non-bootstrap版本编译出来的东西一样),那么最后版本的LFS就都一样了,因为最后的gcc并不是这里的gcc。
回复 支持 反对

使用道具 举报

发表于 2006-3-3 07:29:06 | 显示全部楼层
bootstrap [color="Red"]不是用来提高纯度的,觉得是你们理解有误。

bootstrap 的作用是检查 编译出来的gcc 是否正确,并没有进行任何纯净度的操作。。。(不是提纯。嘿嘿。)
回复 支持 反对

使用道具 举报

发表于 2006-3-3 11:48:40 | 显示全部楼层
bootstrap更多情况下没有必要,做cross 时候根本就无法实现。
bootstrap可以让编译器得到优化,第2遍就可以停止,第3遍是为了保证校验。
举个例子:
gcc-3.2 编译gcc-4.0的src,看看有什么区别
只一遍:gcc-4的大小为10M(假设),原因,gcc-3.2的优化,真能这么大。
第二遍:gcc-4的大小为8M,使用第一次生成的gcc-4编译,优化改进
第三遍:和第2遍一摸一样。
这是个大概的描述,理解一下,就明白了
在什么情况用bootstrap好?编译器的版本低于src的版本时!同版本编译无意义:)
回复 支持 反对

使用道具 举报

发表于 2006-3-3 11:55:15 | 显示全部楼层
能否得到优化,我不知道。

我只是想知道,bootstrap之后, make install 的时候安装的是第几次编译出来的gcc。这个让我很好奇。我没研究过,不过我觉得应该是安装第一次出来的结果。
回复 支持 反对

使用道具 举报

发表于 2006-3-3 13:05:25 | 显示全部楼层
安装第三次出来的吧,我也是猜得:)
反正感觉不是第一次出来的:)
回复 支持 反对

使用道具 举报

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

本版积分规则

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