LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: youbest

[原创]换个角度看LFS——反向分析LFS

[复制链接]
发表于 2006-8-12 01:31:14 | 显示全部楼层
内核这东西比较特殊,虽然运行任何程序都需要用的内核,但本身在制作目标系统过程中,目标系统的Linux内核却不需要先进行编译,因为使用Linux内核并不像glibc那样,是依靠动态链接库的方式被调用的,因此后面将不再探讨Linux内核的问题。

这个,是因为装了 kernel header 的原因。:)。。
但这里有一个问题就是:“主系统”中的gcc和binutils与“预工具”中要求的gcc和binutils版本不同(通常会老些),但只要能正确编译 binutils、gcc就行了,gcc具备自我编译的功能,因此建议编译不同版本的gcc采用bootstrap的方式比较好。当然“主系统”中的在参 与编译过程中的其它工具也需要符合要求就成。

gcc 的 bootstrap 不是用来解决这个版本问题的,纯属是用来检查编译出来的 gcc 是否正确。。bootstrap 和 非 bootstrap 编译出来的gcc 是一样的。不同的是 bootstrap 在编译了再一次后,又用编译出来的gcc编译一个gcc,再用第二个gcc编译最后一个gcc,如果结果相同,那么就可以认为这个gcc是正确的。这样也就解释了,为什么在 CrossLFS 的时候,一般不用 bootstrap,因为后几次的无法进行,不同架构的说。当然,相同体系的话,还是可以进行。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-12 12:01:01 | 显示全部楼层
Post by 终极幻想
这个,是因为装了 kernel header 的原因。:)。。

大概我没描述清楚,我的意思就是内核不像glibc,glibc是依靠动态链接库的方式调用的,内核不是用动态链接的方式,所以不需要先编译.
已在原文改正。

Post by 终极幻想

gcc 的 bootstrap 不是用来解决这个版本问题的,纯属是用来检查编译出来的 gcc 是否正确。。bootstrap 和 非 bootstrap 编译出来的gcc 是一样的。不同的是 bootstrap 在编译了再一次后,又用编译出来的gcc编译一个gcc,再用第二个gcc编译最后一个gcc,如果结果相同,那么就可以认为这个gcc是正确的。这样也就解释了,为什么在 CrossLFS 的时候,一般不用 bootstrap,因为后几次的无法进行,不同架构的说。当然,相同体系的话,还是可以进行。。。

这里纯属LFS分析,所以没考虑CLFS(不过在我的CLFS2中的分析里也写了一些).
关于bootstrap的作用,我觉得在LFS确实是为了保证gcc是用和自己相同版本编译的原因,因为在整个LFS中三次编译gcc,只有第一次用了bootstrap,那就是因为主系统的版本不确定,而后两次已经能确定gcc的版本一致,所以没有再用bootstrap,如果按照检查是否正确的说法的话,后两次的gcc的作用更重要,却不做bootstrap就说不过去了,所以我认为,bootstrap就是为了在不同的gcc版本编译的时候用的.
回复 支持 反对

使用道具 举报

发表于 2006-8-12 15:11:36 | 显示全部楼层
youbest,肯定花了大把的时间在LFS上了吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-12 15:28:35 | 显示全部楼层
Post by sumargin
youbest,肯定花了大把的时间在LFS上了吧?
嗯,是没少花时间。
回复 支持 反对

使用道具 举报

发表于 2006-8-12 19:25:11 | 显示全部楼层
真利害!把复杂的东西用这些线条、框框勾勒到简单明了。
回复 支持 反对

使用道具 举报

发表于 2006-8-12 22:11:20 | 显示全部楼层
Post by youbest
这里纯属LFS分析,所以没考虑CLFS(不过在我的CLFS2中的分析里也写了一些).
关于bootstrap的作用,我觉得在LFS确实是为了保证gcc是用和自己相同版本编译的原因,因为在整个LFS中三次编译gcc,只有第一次用了bootstrap,那就是因为主系统的版本不确定,而后两次已经能确定gcc的版本一致,所以没有再用bootstrap,如果按照检查是否正确的说法的话,后两次的gcc的作用更重要,却不做bootstrap就说不过去了,所以我认为,bootstrap就是为了在不同的gcc版本编译的时候用的.

恩,不管 CLFS 还是 LFS,我们讨论的是 bootstrap。

bootstrap 的作用:


For a native build issue the command `make bootstrap'.  This will build the entire GCC system, which includes the following steps:



1. Build host tools necessary to build the compiler such as texinfo, bison, gperf.

2. Build target tools for use by the compiler such as binutils (bfd, binutils, gas, gprof, ld, and opcodes) if they have been individually linked or moved into the top level GCC source tree before configuring.
3. Perform a 3-stage bootstrap of the compiler.
4. Perform a comparison test of the stage2 and stage3 compilers.
5. Build runtime libraries using the stage3 compiler from the previous step.

所以说,这个不是校正版本用的,只是用来检查。不管版本是否相同。
回复 支持 反对

使用道具 举报

发表于 2006-8-16 17:35:48 | 显示全部楼层
Post by 终极幻想
恩,不管 CLFS 还是 LFS,我们讨论的是 bootstrap。

bootstrap 的作用:


For a native build issue the command `make bootstrap'.  This will build the entire GCC system, which includes the following steps:



1. Build host tools necessary to build the compiler such as texinfo, bison, gperf.

2. Build target tools for use by the compiler such as binutils (bfd, binutils, gas, gprof, ld, and opcodes) if they have been individually linked or moved into the top level GCC source tree before configuring.
3. Perform a 3-stage bootstrap of the compiler.
4. Perform a comparison test of the stage2 and stage3 compilers.
5. Build runtime libraries using the stage3 compiler from the previous step.

所以说,这个不是校正版本用的,只是用来检查。不管版本是否相同。
常言道,引用應註明出處。。。(閃)!
回复 支持 反对

使用道具 举报

发表于 2006-8-17 05:04:32 | 显示全部楼层
Post by d00m3d
常言道,引用應註明出處。。。(閃)!

http://gcc.gnu.org/install/build.html

嘿嘿,因为是从 gcc 包里边的文件看到的,所以没写出引用。。sorry。
(给我追,看你往哪闪)。。
回复 支持 反对

使用道具 举报

发表于 2007-6-21 00:24:53 | 显示全部楼层
在做了一次lfs后回过头来看这篇文章,简直就是茅塞顿开阿!
回复 支持 反对

使用道具 举报

发表于 2007-6-21 22:47:59 | 显示全部楼层
My God,youbest兄真乃神也!
回复 支持 反对

使用道具 举报

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

本版积分规则

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