+ -
当前位置:首页 → 问答吧 → bootstrap的必要性

bootstrap的必要性

时间:2006-03-03

来源:互联网

似乎觉得这么做有道理,但严格想起来又找不到需要bootstrap的充分的理由。因为如果第一次编译gcc时不bootstrap,似乎对以后的工作也没什么影响。难道仅仅是测试一下这个gcc能否自己编译自己吗?况且这个bootstrap使用host system的glibc来做的,到了使用自己的glibc的时候,为什么就一定能保证它第一遍自己编译自己的结果和自己一样呢?因为两个glibc可能行为不同啊。

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

另外,有没有这样的可能,就是gcc不能完成bootstrap?也就是不管自己编译自己多少次,每次结果都不一样?

作者: vanhu   发布时间: 2006-03-03

没有更加 "纯净" 的方法了,再多编译几遍也没有用.

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

作者: dyhml   发布时间: 2006-03-03

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的分野,其他如生成的代码也有所不同

作者: d00m3d   发布时间: 2006-03-03

引用:
作者: 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。

作者: vanhu   发布时间: 2006-03-03

引用:
作者: vanhu
凡是一个编译器能够bootstrap,那么用这个编译器的“non-bootstrap”版本和“bootstrap”版本编译出来的东西都是一样的
一样的也最多是 gcc 来编译出来的东西一样,但是 gcc 本生并不一样。

作者: zlbruce   发布时间: 2006-03-03

引用:
作者: zlbruce
一样的也最多是 gcc 来编译出来的东西一样,但是 gcc 本生并不一样。
这就够了,因为这里讨论的gcc是第一次编译的gcc,它只是作为工具,只要从这里开始一样(是指和non-bootstrap版本编译出来的东西一样),那么最后版本的LFS就都一样了,因为最后的gcc并不是这里的gcc。

作者: vanhu   发布时间: 2006-03-03

bootstrap 不是用来提高纯度的,觉得是你们理解有误。

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

作者: 晨想   发布时间: 2006-03-03

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的版本时!同版本编译无意义:)

作者: good02xaut   发布时间: 2006-03-03

能否得到优化,我不知道。

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

作者: 晨想   发布时间: 2006-03-03

安装第三次出来的吧,我也是猜得:)
反正感觉不是第一次出来的:)

作者: good02xaut   发布时间: 2006-03-03

有啥根据?。。。

作者: 晨想   发布时间: 2006-03-03

可以通过查看生成gcc的大小
通过不同的优化,生成的gcc大小应该不可能一样大的。
有兴趣可以对比一下,到底系统install的是哪个。
还有一点,第二次编译的时候xgcc好像把第一次的覆盖了,install的时候系统找不到那个了,怎么装啊?呵呵

作者: good02xaut   发布时间: 2006-03-03

3个stage,是各自拷贝的,没有覆盖的。我看过 Makefile,至少里边是这么注释的。

作者: 晨想   发布时间: 2006-03-03

可我查看make出来的xgcc怎么就找到了一个?

作者: good02xaut   发布时间: 2006-03-03

也许后边编译的都没保留,或者只保留了最后的那个。。不清楚,没研究了。

作者: 晨想   发布时间: 2006-03-03

现在咱们讨论问题越来越精辟了:)
很多时候都不了了之,不过答案已经有了,即使没有明确出来,也给了明确的方法。
唯一需要做的就是验证的过程,毕竟不能每个问题都亲自验证。
想知道答案还是自己验证比较好,一来有成就感,二来可以更深入的理解。

全面贯彻授人以渔的方针

呵呵

作者: good02xaut   发布时间: 2006-03-05

第一次的只是工具,不会安装的.

只有 第二次 和 第三次 的 gcc 完全相同时, 才会安装, 这时 第二遍 和 第三遍 没有区别.

如果不同, make 就会停止,报错.

作者: dyhml   发布时间: 2006-03-05

那你说到底是第2次的还是第3次的?
一样毕竟不是一个啊
根据生成的时间是可以看出先后的,到底安装的是哪个呢?
还是让想知道答案的去验证吧,反正我是不去看了:)

呵呵

作者: good02xaut   发布时间: 2006-03-05

Bootstrap:
This target does not just compile GCC, but compiles it several times. It uses the programs compiled in a first round to compile itself a second time, and then again a third time. It then compares these second and third compiles to make sure it can reproduce itself flawlessly. This also implies that it was compiled correctly.

我还是认为装的是第一次的,后边2次只是比较。虽然应该没什么区别,但是还是好奇。呵呵。

作者: 晨想   发布时间: 2006-03-09

引用:
作者: 晨想
Bootstrap:
This target does not just compile GCC, but compiles it several times. It uses the programs compiled in a first round to compile itself a second time, and then again a third time. It then compares these second and third compiles to make sure it can reproduce itself flawlessly. This also implies that it was compiled correctly.

我还是认为装的是第一次的,后边2次只是比较。虽然应该没什么区别,但是还是好奇。呵呵。
> cd gcc-build
> find ./ -name 'cc1' -exec ls -l {} \; -exec md5sum {} \;
-rwxr-xr-x 1 lfs lfs 16968934 02-17 10:35 ./gcc/cc1
58b7dd1725cbe57e1d69e75530986401 ./gcc/cc1
-rwxr-xr-x 1 lfs lfs 18934182 02-17 10:12 ./gcc/stage1/cc1
d108f6d510d0aaffe9029fb05ed5a225 ./gcc/stage1/cc1
-rwxr-xr-x 1 lfs lfs 16968934 02-17 10:28 ./gcc/stage2/cc1
58b7dd1725cbe57e1d69e75530986401 ./gcc/stage2/cc1

> cd /tools
> find ./ -name 'cc1' -exec ls -l {} \; -exec md5sum {} \;
-rwxr-xr-x 1 lfs lfs 16968934 02-17 10:36 ./libexec/gcc/i686-pc-linux-gnu/4.1.2/cc1
58b7dd1725cbe57e1d69e75530986401 ./libexec/gcc/i686-pc-linux-gnu/4.1.2/cc1

按照md5看,装的肯定不是第一次,stage2 或者 stage3, 两个的md5是一样的

作者: jinxl   发布时间: 2008-02-17

我还真没用MD5 去看过,楼上的兄弟,细心了!

作者: 晨想   发布时间: 2008-02-17

刚刚编译过 gcc-4.3 rc1,结果如下:

gcc-build 目录下:
代码:
d00m3d@BlackMesa:~/BLFS-sources/gcc-build$ find ./ -name 'cc1' -exec ls -l {} \; -exec md5sum {} \;
-rwxrwxr-x 1 d00m3d d00m3d 24754861 Feb 23 15:02 ./prev-gcc/cc1
78fef94f8e63ba48d693f6eb92445651 ./prev-gcc/cc1
-rwxrwxr-x 1 d00m3d d00m3d 55755072 Feb 23 14:15 ./stage1-gcc/cc1
6934e9a5726d5fad725ebe57182cd91d ./stage1-gcc/cc1
-rwxrwxr-x 1 d00m3d d00m3d 24754739 Feb 23 15:19 ./gcc/cc1
7f2e56f6a4b8d7ebe3bb62388d96e6c7 ./gcc/cc1
d00m3d@BlackMesa:~/BLFS-sources/gcc-build$
安装後的是:
代码:
d00m3d@BlackMesa:/usr/lib$ cd gcc
d00m3d@BlackMesa:/usr/lib/gcc$ ls
i686-pc-linux-gnu
d00m3d@BlackMesa:/usr/lib/gcc$ cd i*
d00m3d@BlackMesa:/usr/lib/gcc/i686-pc-linux-gnu$ ls
4.2.2 4.3.0
d00m3d@BlackMesa:/usr/lib/gcc/i686-pc-linux-gnu$ cd 4.3.0
d00m3d@BlackMesa:/usr/lib/gcc/i686-pc-linux-gnu/4.3.0$ ls
cc1 cc1plus collect2 install-tools
d00m3d@BlackMesa:/usr/lib/gcc/i686-pc-linux-gnu/4.3.0$ ll
total 51044
-rwxr-xr-x 1 root root 24754739 Feb 23 15:30 cc1
-rwxr-xr-x 1 root root 27130027 Feb 23 15:30 cc1plus
-rwxr-xr-x 1 root root 310905 Feb 23 15:30 collect2
drwxrwxr-x 2 root root 4096 Feb 23 15:30 install-tools
d00m3d@BlackMesa:/usr/lib/gcc/i686-pc-linux-gnu/4.3.0$ md5sum cc1
7f2e56f6a4b8d7ebe3bb62388d96e6c7 cc1
d00m3d@BlackMesa:/usr/lib/gcc/i686-pc-linux-gnu/4.3.0$
Stage 的名字有点改变了,但看出来安装的是最後一次的版本

作者: d00m3d   发布时间: 2008-02-25

路过,谢谢!!!!!!!!

作者: superyongzhe   发布时间: 2010-06-01

路过,谢谢!!!!!!!!

作者: superyongzhe   发布时间: 2010-06-01