LinuxSir.cn,穿越时空的Linuxsir!

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

新手的问题:binutils为什么要编译两遍

[复制链接]
发表于 2007-4-11 10:42:04 | 显示全部楼层 |阅读模式
参照精华区的介绍,一步一步做到了gcc的第二遍。发现之后binutils也要第二遍编译,这个有点不明白了,我经常将lfs和cross compiler相互联系,因为之间的步骤感觉挺象的。可是如果做一个arm-elf的cross compiler似乎不用两遍编译binutils吧,为什么lfs需要两遍编译呢?请给解释一下,非常感谢
发表于 2007-4-11 12:54:21 | 显示全部楼层
你在 LFS 还是 CLFS?

你的问题是问 LFS 的时候?
回复 支持 反对

使用道具 举报

发表于 2007-4-11 13:16:23 | 显示全部楼层
Post by d00m3d
你在 LFS 还是 CLFS?

你的问题是问 LFS 的时候?

难道原因还会不一样?
回复 支持 反对

使用道具 举报

发表于 2007-4-11 14:58:42 | 显示全部楼层
LFS 中 binutils一共编译三次
第1次编译(binutils pass1) 的程序是个临时程序,供gcc和glibc的编译使用,其中ld指向host的库目录。然后又重新生成了一次ld程序

  1. make -C ld clean
  2. make -C ld LIB_PATH=/tools/lib
  3. cp -v ld/ld-new /tools/bin
复制代码

这个ld-new程序还未启用,到5.7调整工具链以后才被用到

第2次编译(binutils pass2)的程序是为生成临时系统使用的,在安装完以后,又重新生成了ld一次,这次重新生成的ld程序将来用以生成目标系统,在将来6.10中才被用到

第三次编译的binutils程序是目标系统中的程序,如果不打算在目标系统中安装编译工具链,这个就可以不做了
回复 支持 反对

使用道具 举报

发表于 2007-4-11 15:07:52 | 显示全部楼层
Post by hans_yu
LFS 中 binutils一共编译三次
第1次编译(binutils pass1) 的程序是个临时程序,供gcc和glibc的编译使用,其中ld指向host的库目录。然后又重新生成了一次ld程序

  1. make -C ld clean
  2. make -C ld LIB_PATH=/tools/lib
  3. cp -v ld/ld-new /tools/bin
复制代码

这个ld-new程序还未启用,到5.7调整工具链以后才被用到

第2次编译(binutils pass2)的程序是为生成临时系统使用的,在安装完以后,又重新生成了ld一次,这次重新生成的ld程序将来用以生成目标系统,在将来6.10中才被用到

第三次编译的binutils程序是目标系统中的程序,如果不打算在目标系统中安装编译工具链,这个就可以不做了

好麻烦啊。。一个系统的创立是不容易的事情
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-11 17:14:16 | 显示全部楼层
多谢各位,谢谢hans_yu的回答。我是问LFS,
可是不好意思,仍然不是很明白,首先说下我的理解,如果不对请指出错误。然后再问两个问题,谢谢回答
我的理解是这样的:为了编译gcc的源码得到bootstrap,首先要编译binutils,之后编译bootstrap,因为还没有glibc库所以只能不打开c++,然后用得到的bootstrap编译glibc得到c库,这样就可以利用这个c库再二次编译gcc源码,打开c++从而得到一个完整的compiler。
第一个问题就是:这样不就可以了么?gcc和glibc使用的临时binutils不能用于临时系统吗?为什么非要再次编译一下binutils呢?
第二个问题:编译binutils时候加入参数--with-lib-path=/tools/lib和make -C ld clean && make -C ld LIB_PATH=/tools/lib是不是等价的啊?前者是传递给链接器的库搜索路径设置成/tools/lib,难道编译binutils的时候需要用到c库或者什么库么?
回复 支持 反对

使用道具 举报

发表于 2007-4-11 21:47:28 | 显示全部楼层
楼上的兄弟,LFS的基本原理是:从host(发行版linux或liveCD)环境中,先创建一个临时环境(也就是在tools目录下建立个各种工具),此时还会部分利用host的工具,然后利用这个临时环境,此时脱离了host的所有工具,来建立目标机的所有工具。
所以你的理解对了一半,第一遍的binutils和gcc只用来编译glibc,在编译过程中还需要利用host的库文件来执行程序,而glibc不需要C++,所以不用编译。第二遍的binutils、gcc、glibc作为一个完整的工具链,用来编译临时系统,所生成的程序都会从tools/lib目录下查找动态链接库来执行,因此生成的程序就与host系统无关了,也是因为这个原因不能使用第一遍的bintuils和gcc。而最终生成的系统需要从缺省的/lib或/usr/lib下查找库文件,所以后面还需要再编译一次binutils和gcc。
关于第二个问题,make -C ld clean是删除刚生成的ld的内容,--with-lib-path和LIB_PATH=/tools/lib的作用我想应该是等价的。编译的时候由于有打开文件之类的操作,所以肯定会用到库文件。
回复 支持 反对

使用道具 举报

发表于 2007-4-11 22:10:05 | 显示全部楼层
gcc 的 bootstrap 除了除错外,还有一个很重要的环节是要排除主系统上 gcc 的影响,特别是 ABI 可能是的不同的版本,避免由主系统遗传到目标系统里
回复 支持 反对

使用道具 举报

发表于 2007-4-11 23:05:39 | 显示全部楼层
那个似乎是,,在 fix_includes 和 调整工具链的时候做的,bootstrap有这个作用?不清楚了。。
回复 支持 反对

使用道具 举报

发表于 2007-4-11 23:24:40 | 显示全部楼层
噢~太累了!脑子不清醒了,要睡了 :sleep
回复 支持 反对

使用道具 举报

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

本版积分规则

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