QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3960|回复: 6

用GCC4编译2.6.11.8内核的过程和总结

[复制链接]
发表于 2005-5-3 10:02:01 | 显示全部楼层 |阅读模式
昨天折腾了一下午,试图用gcc4编译内核通过,唯一的体会是:“真的不是越先进的东西就越好!!!”
虽然最后编译通过了,但是系统启动的时候,在configuring kernel parameters这里会failed,并dump一些东西,
一来屏幕一闪就过去了,看不清,另外,都是16进制数,看清了也没用。不过虽说有failed,但是用gcc4编译的内核
使用起来却没问题,adsl,usb等功能都很正常。具体的和大家说说我的作法,希望高人能指教如何改正上面的failed。顺便问一下,内核启动的时候输出在屏
幕上的内容可以保存到文件中吗?如果可以,要怎么做呢?

其实gcc4.0.0和gcc3.4.3相比,对用户不透明的重大改动并不是很多,大多是一些优化以及语言扩展方面的东西,
具体的可以看看GNU的手册,写的很清楚,但是在编译内核的时候,我却发现了一个和gcc3.4.3在编程方面不同的
地方,它就是:在你声明一个结构类型的数组时,你必须先定义该结构,而不能只是做一个简单的声明就OK了,
举个例子:
[code:1]#include <stdio.h>

struct UBYTE;

struct UBYTE test[3];

struct UBYTE {
        unsigned char c;
};

int main() {
        struct UBYTE test[3] = { 'a', 'b', 'c' };
        printf("%c", test[0]);
        return 0;
}[/code:1]
这段程序用gcc test.c -o test完全可以编译通过,但是你用gcc400 test.c -o test(gcc400是我为GCC4做的一
个符号链接)就会出现array type has incomplete type的错误,所以,你在定义test之前,一定要给出UBYTE的定义,
像下面这样:
[code:1]#include <stdio.h>

struct UBYTE;

struct UBYTE {
        unsigned char c;
};

struct UBYTE test[3];

int main() {
        struct UBYTE test[3] = { 'a', 'b', 'c' };
        printf("%c", test[0]);
        return 0;
} [/code:1]
这段代码是gcc3.4.3和gcc4.0.0都可以接受的。

而正是上面提到的这一点,影响了gcc4的内核编译,有一些内核的驱动程序是按照第一种方法写的,所以导致了
与gcc4不兼容,按照magic linux的默认配置,我找到了下面两个地方,只要简单的修改一下,就好了,它们是:

include/linux/i2c.h : line 58 197
错误:
        array type has incomplete element type
解决方法:
        把struct i2c_msg放到第58行前面

drivers/media/video/bttvp.h : line 233
错误:
        variables has incomplete type
解决方法:
        这个头文件文问题稍多,首先要把struct bttv的定义放到233行的前面,之后,把struct bttv_pll_info和
        bttv_suspend_state的定义在放到struct bttv前面,这样就解决了上面说到的定义关联性的问题

之后编译内核的时候用make CC="gcc400" -j2就可以编译内核了,当然你也可以修改Makefile把CC的值换掉,这两种方法我都试过了,
但是在内核启动的时候都会出现failed,我现在怀疑是不是rc.sysinit配置文件的问题,我除了usb那里都没做修改,希望高手指教一下。
发表于 2005-5-3 10:23:35 | 显示全部楼层
几乎所有的软件都要打补钉,否则就是用 gcc4 性能改善也不明显。
回复

使用道具 举报

发表于 2005-5-3 10:37:32 | 显示全部楼层
这个就是一个明显的例子:gcc 3.x 原本支持的 “不符合标准”的功能在 gcc 4.0 中都被干掉了。这样才能让大家写程序的时候保存一个好的习惯
回复

使用道具 举报

发表于 2005-5-3 14:08:46 | 显示全部楼层
要打补丁的软件并不多。。。
回复

使用道具 举报

 楼主| 发表于 2005-5-3 17:33:01 | 显示全部楼层
楼上各位大虾,关于内核启动时候的错误到底能不能解决呢?
还是我的方法有问题??
回复

使用道具 举报

发表于 2005-5-9 15:21:30 | 显示全部楼层
[quote:6601e94cf5="sunmoon1997"]要打补丁的软件并不多。。。[/quote]
如果仅仅用它编译,那么的确如此。如果要使用新技术,就必须打补丁。
回复

使用道具 举报

发表于 2005-5-12 22:50:04 | 显示全部楼层
个人认为,要重新构建工具链.
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-4-18 15:38 , Processed in 0.071701 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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