当前时区 GMT+8, 现在时间是 2008-9-7 19:45 游客: 注册 登录 仅登录论坛 | 搜索 帮助


标题: 用GCC4编译2.6.11.8内核的过程和总结
puretears
注册会员
Rank: 2


UID 153833
精华 5
积分 200
帖子 70
阅读权限 20
注册 2004-9-17
来自 China.gif
状态 离线
发表于 2005-5-3 10:02  资料  短消息  加为好友 
用GCC4编译2.6.11.8内核的过程和总结

昨天折腾了一下午,试图用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那里都没做修改,希望高手指教一下。

顶部
KDE
超级版主



UID 527
精华 27
积分 11717
帖子 4795
阅读权限 245
注册 2002-7-4
来自 China
状态 离线
发表于 2005-5-3 10:23  资料  短消息  加为好友  添加 KDE 为MSN好友 通过MSN和 KDE 交谈 QQ ICQ 状态
几乎所有的软件都要打补钉,否则就是用 gcc4 性能改善也不明显。

顶部
liuspider
高级会员
Rank: 4


UID 1657
精华 2
积分 1511
帖子 601
阅读权限 50
注册 2002-7-29
来自 广东
状态 离线
发表于 2005-5-3 10:37  资料  主页 短消息  加为好友 
这个就是一个明显的例子:gcc 3.x 原本支持的 “不符合标准”的功能在 gcc 4.0 中都被干掉了。这样才能让大家写程序的时候保存一个好的习惯





生于忧患,死于安乐! Fly together Forever
顶部
sunmoon1997
公社版主



UID 56569
精华 4
积分 3619
帖子 1985
阅读权限 225
注册 2003-8-21
来自 China
状态 在线
发表于 2005-5-3 14:08  资料  主页 短消息  加为好友  QQ
要打补丁的软件并不多。。。





偷来的签名: [code:1] USE="-bitch -in-laws nice gorgeous smart" emerge girlfriend >>> china/suzhou/girlfriend merged [/code:1]
顶部
puretears
注册会员
Rank: 2


UID 153833
精华 5
积分 200
帖子 70
阅读权限 20
注册 2004-9-17
来自 China.gif
状态 离线
发表于 2005-5-3 17:33  资料  短消息  加为好友 
楼上各位大虾,关于内核启动时候的错误到底能不能解决呢?
还是我的方法有问题??

顶部
KDE
超级版主



UID 527
精华 27
积分 11717
帖子 4795
阅读权限 245
注册 2002-7-4
来自 China
状态 离线
发表于 2005-5-9 15:21  资料  短消息  加为好友  添加 KDE 为MSN好友 通过MSN和 KDE 交谈 QQ ICQ 状态
[quote:6601e94cf5="sunmoon1997"]要打补丁的软件并不多。。。[/quote]
如果仅仅用它编译,那么的确如此。如果要使用新技术,就必须打补丁。

顶部
qianzheng82
中级会员
Rank: 3Rank: 3


UID 10203
精华 0
积分 528
帖子 211
阅读权限 30
注册 2002-12-30
来自 上海
状态 离线
发表于 2005-5-12 22:50  资料  短消息  加为好友 
个人认为,要重新构建工具链.

顶部
 


Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
清除 Cookies - 联系我们 - 中国Linux公社 - WAP