LinuxSir.cn,穿越时空的Linuxsir!

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

clfsv2问题请教:为什么需要编译第二次gcc

[复制链接]
发表于 2008-6-30 18:13:02 | 显示全部楼层 |阅读模式
用CLFS v2方法编译系统,编译支持c的gcc不需要完整的目标glibc,而第二次编译支持c和c++的gcc则需要,请问是什么原因呢?如果目标系统不使用以c++为源码的包,是不是就不必编第二次gcc呢?
发表于 2008-6-30 22:11:18 | 显示全部楼层
两次的prefix不一样.第一次prefix=/tools,建立工具链.第二次才是用于目录系统的.我认为第一次可以跳过.不知道讲得对不对
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-1 09:24:41 | 显示全部楼层
ls不对,两次make gcc都是做的交叉版本,注意是CLFS v2
回复 支持 反对

使用道具 举报

发表于 2008-7-1 16:29:51 | 显示全部楼层
第一次是静态编译,不生成动态库,第二次则生成,不只是c++支持的问题
回复 支持 反对

使用道具 举报

发表于 2008-7-2 08:46:28 | 显示全部楼层
第一遍gcc只是为编译glibc而编译的,gcc第二遍是生成交叉编译用的工具链工具
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-2 09:32:31 | 显示全部楼层
ls两位说的我也知道,如果第一次编译就把--disable-shared去掉编译出动态库,假如不需要gcc支持的话,那么这个gcc是不是就可以作为交叉工具链的gcc呢?
回复 支持 反对

使用道具 举报

发表于 2008-7-3 22:08:39 | 显示全部楼层
Post by ukyo111;1870123
ls两位说的我也知道,如果第一次编译就把--disable-shared去掉编译出动态库,假如不需要gcc支持的话,那么这个gcc是不是就可以作为交叉工具链的gcc呢?


你实践一下就知道了。要编译动态库,就需要Glibc提供的启动代码。但是在完成Glibc之前我们没有这个,所以第一遍无法编译出使用动态库的gcc
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-4 09:22:10 | 显示全部楼层
谢谢,有空试一下
回复 支持 反对

使用道具 举报

发表于 2008-7-11 13:25:02 | 显示全部楼层
这个问题的根源在于Richard M. Stallman,甚至可追溯到c语言创建者Ken Thompson、Dennis Ritchie。

gnu工具链分散在三个软件包
binutils——汇编器、连接器
gcc——预处理器、编译器
glibc——c库
好处是灵活,可以使用其他c库,如uclibc、uc-libc、newlib,
坏处是gcc、glibc有循环依赖问题,工具链自举时需要编译gcc两编,
第一遍编译的gcc是裸编译器,也就是没有任何库支持的编译器,只能编译glibc、linux-kernel等一类完全自给自足的软件包。

如果把3者整合到一个软件包,一编编译工具链是可能的,可这样与unix哲学相违背。

PS:中文已经把stallman糟蹋了,为“高人”默哀。
回复 支持 反对

使用道具 举报

发表于 2008-7-12 16:36:01 | 显示全部楼层
现在在4.3系列下编译交叉编译GCC甚至可能需要三步:
1、编译裸编译器(之前好歹有个libgcc,现在是真正不含任何目标机器代码的裸编译器)
2、安装目标机器的Glibc头文件
3、编译仅有libgcc支持的编译器
4、编译安装Glibc
5、正常编译
回复 支持 反对

使用道具 举报

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

本版积分规则

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