LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: 地球发动机

工具链构造彻底剖析

[复制链接]
发表于 2008-3-28 10:38:04 | 显示全部楼层
Post by 地球发动机;1831698
你这个可能有问题。如果你能确定目标版本最好在同一版本上编译CLFS。不过一般来说glibc用到的内核头文件并不会有太大变化,glibc应该没有问题。应用程序大多数通过glibc调用内核,也没什么。但是util,module-tools,udev等组件和内核关系密切,估计版本不同是有问题的。我没试过。

此外,要更正你的一点是,视编译参数的不同,gcc的编译可能需要glibc的头文件(可以参见主贴,介绍了如何关闭这个依赖性的方法),但绝对不会需要内核头文件。


哦,gcc需要glibc,glibc需要linux header!
但是gcc编出来的东西还是想不明白到底是咋回事。
首先,我没有给目标板的linux安装glibc,那目标板的linux要加载应用程序的时候,如何找到动态链接库呢?是不是编目标板linux的时候,交叉编译工具链的动态库已经包含在vmlinux里了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-28 16:39:11 | 显示全部楼层
Post by foo2008;1831907
哦,gcc需要glibc,glibc需要linux header!
但是gcc编出来的东西还是想不明白到底是咋回事。
首先,我没有给目标板的linux安装glibc,那目标板的linux要加载应用程序的时候,如何找到动态链接库呢?是不是编目标板linux的时候,交叉编译工具链的动态库已经包含在vmlinux里了?

1. 嵌入式系统一般使用uclibc而不是glibc。
2. 如果你采用动态链接,目标机器不安装libc那是无法运行的。如果选择静态链接就没有问题。
回复 支持 反对

使用道具 举报

发表于 2008-3-28 16:52:56 | 显示全部楼层
Post by 地球发动机;1832062
1. 嵌入式系统一般使用uclibc而不是glibc。

在目标机上用的动态库?host上运行的交叉编译gcc用的glibc也要被替换成uclibc吗?
Post by 地球发动机;1832062
2. 如果你采用动态链接,目标机器不安装libc那是无法运行的。如果选择静态链接就没有问题。

嗯,说的对,终于是搞明白这个问题了:)
回复 支持 反对

使用道具 举报

发表于 2008-3-28 18:23:50 | 显示全部楼层
Post by 地球发动机;1831289
我就是发现你们之前的讨论没到点子上。要生成一个交叉编译器,host和target的glibc一个都不能少。这正是为什么CC工具链需要三步而不是两步的原因。

主要CLFS 没有用到 CC,所以也很少去讨论。:)

Post by 不开花;1831733
楼主所说的CCLFS叫Canadian cross compilation ,具体定义在这里:  http://www.airs.com/ian/configure/configure_6.html
和这里解释了为什么叫这么怪异的名字:http://www.mewburn.net/luke/papers/build.sh.pdf
一个可以做Canadian cross compilation 的工具crosstool http://kegel.com/crosstool/current/doc/crosstool-howto.html
-----------------------------
Canadian cross compilation 小贴示
The sources of a compiler are compiled (i.e. built) on machine X
X is called as the Build system
• The built compiler runs on machine Y
Y is called as the Host system
• The compiler compiles code for target Z
Z is called as the Target system
• Note: The built compiler itself runs on the Host machine and
generates executables that run on Target machine!!!
The built compiler itself runs on the Host machine and
generates executables that run on Target machine!!!
A few interesting permutations of X, Y and Z are:
X = Y = Z Native build
X = Y != Z Cross compiler
X != Y != Z Canadian Cross compiler

当时我就是研究 kegel 的 crosstool 的,不过那个时候他还不支持 CC 。。:(
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-28 18:56:13 | 显示全部楼层
Post by foo2008;1832068
在目标机上用的动态库?host上运行的交叉编译gcc用的glibc也要被替换成uclibc吗?

嗯,说的对,终于是搞明白这个问题了:)


回答你的前一个问题。是,uclibc是一般在目标机器上使用。host上的交叉编译器用宿主的libc,一般是glibc。

我们应该搞清楚,交叉编译器需要host和target的两个libc都存在,才能成功构建。在嵌入式的情况下,host的glibc不应替换,也不可以替换。只有target的libc需要替换为uclibc。

使用uclibc的理由是它更小型化,占用资源更少,更适合于嵌入式环境使用。
回复 支持 反对

使用道具 举报

发表于 2008-3-29 11:47:21 | 显示全部楼层
看完本篇又再看 CLFS 手冊一遍,理解又再清釋了一遍

地球啊,you are my star!
回复 支持 反对

使用道具 举报

发表于 2008-3-29 15:18:36 | 显示全部楼层
Post by 地球发动机;1832113
回答你的前一个问题。是,uclibc是一般在目标机器上使用。host上的交叉编译器用宿主的libc,一般是glibc。

我们应该搞清楚,交叉编译器需要host和target的两个libc都存在,才能成功构建。在嵌入式的情况下,host的glibc不应替换,也不可以替换。只有target的libc需要替换为uclibc。

使用uclibc的理由是它更小型化,占用资源更少,更适合于嵌入式环境使用。


似乎是明白了:)
生成交叉编译器需要host的glibc(x86)和target的uclibc(mips)(如有的是空间glibc(mips)更好),这个交叉编译器生成目标板用的application就在目标机上用uclibc(mips)(或者相同glibc(mips))!
hoho,太谢谢了
回复 支持 反对

使用道具 举报

发表于 2008-3-29 18:17:18 | 显示全部楼层
Post by d00m3d;1832371
看完本篇又再看 CLFS 手冊一遍,理解又再清釋了一遍

地球啊,you are my star!

原来d00m3d是月亮。嘿嘿。~~:Angel:
回复 支持 反对

使用道具 举报

发表于 2008-4-10 00:22:45 | 显示全部楼层
今天偶然看到http://linuxfromscratch.org/pipe ... ovember/000033.html提到
no need to install glibc headers to build bootstrap gcc?
This depends on the architecture. MIPS and sparc don't require the
glibc-headers to be built
but x86, x86_64, and alpha require them. If you don't build them gcc
will fail.

所以对下面这一段强烈质疑
Post by 地球发动机;1830416
CLFS-SYSROOT的工具链稍有不同,顺序如下:
头文件->cross-binutils->glibc头文件->cross-gcc c->gibc->gcc-final (c/c++)
我们看到这里多了一个glibc头文件的安装。事实上,这是由于这里编译的gcc是要用sysroot的缘故。在gcc/configure里面有一段代码,大家在vi里面输入/inhibit_libc=false就可以发现,在交叉编译,而没有SYSROOT的情况下,inhibit_libc的值会成为true,而要是sysroot了,就false了。
这个变量的作用,如同有关的注释所述,是用来关闭gcc对glibc头文件的依赖。因此,在sysroot下我们才会需要这样一个安装glibc头文件的步骤。
要想在sysroot下消除这个步骤,使用这个sed命令打个补丁即可:
cp gcc/configure{,.orig}
sed -e 's/inhibit_libc=false/inhibit_libc=true/g' gcc/configure.orig > gcc/configure


lz有没有亲自测试过上面提到的“补丁”,误人子弟就不好了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-4-10 12:42:34 | 显示全部楼层
请放心使用,这个补丁是在GCC 4.2.3下完整测试过了的。

此外,你看到那篇文章似乎老了点,是2年前的。估计也不是现在这个版本。所以情况有所不同,也是很正常的。此外可以告诉你,早期的CLFS的确需要先安装Glibc头文件,但现在已经不需要了,只有SYSROOT CLFS还需要。这个补丁是专门针对SYSROOT的,如果你不用SYSROOT,那么就不需要这个补丁。

Post by 1987a;1836649
今天偶然看到http://linuxfromscratch.org/pipe ... ovember/000033.html提到
no need to install glibc headers to build bootstrap gcc?
This depends on the architecture. MIPS and sparc don't require the
glibc-headers to be built
but x86, x86_64, and alpha require them. If you don't build them gcc
will fail.

所以对下面这一段强烈质疑


lz有没有亲自测试过上面提到的“补丁”,误人子弟就不好了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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