Linux编译驱动implicit,scull字符设备驱动编译在新内核编译问题解决方案

最近在看《LINUX设备驱动程序》,给出的字符设备驱动程序scull,在linux 2.6.32-22内核上make编译时出现了下面的问题:

make -C /lib/modules/2.6.32-22-generic/build M=/home/elite/Desktop/linux设备驱动开发/examples/scull LDDINC=/home/elite/Desktop/linux设备驱动开发/examples/scull/../include modules

make[1]: Entering directory `/usr/src/linux-headers-2.6.32-22-generic'

scripts/Makefile.build:49: *** CFLAGS was changed in "/home/elite/Desktop/linux设备驱动开发/examples/scull/Makefile". Fix itto use EXTRA_CFLAGS.  Stop.

make[1]: *** [_module_/home/elite/Desktop/linux设备驱动开发/examples/scull] Error 2

make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-22-generic'

make: *** [modules] Error 2

打开Makefile,将CFLAGS屏蔽掉:

# CFLAGS += $(DEBFLAGS)

# CFLAGS += -I$(LDDINC)

继续make,又出现了下面的问题:

make -C /lib/modules/2.6.32-22-generic/build M=/home/elite/Desktop/linux设备驱动开发/examples/scull LDDINC=/home/elite/Desktop/linux设备驱动开发/examples/scull/../include modules

make[1]: Entering directory `/usr/src/linux-headers-2.6.32-22-generic'

CC [M]  /home/elite/Desktop/linux设备驱动开发/examples/scull/main.o

/home/elite/Desktop/linux设备驱动开发/examples/scull/main.c:17:26: error:linux/config.h: No such file or directory

make[2]: *** [/home/elite/Desktop/linux设备驱动开发/examples/scull/main.o] Error 1

make[1]: *** [_module_/home/elite/Desktop/linux设备驱动开发/examples/scull] Error 2

make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-22-generic'

make: *** [modules] Error 2

linux/config.h文件找不到,可能时新版内核结构改变了,这个文件被删除了吧。

打开main.c,把#include 删除掉。

继续make,还有问题:

make -C /lib/modules/2.6.32-22-generic/build M=/home/elite/Desktop/linux设备驱动开发/examples/scull LDDINC=/home/elite/Desktop/linux设备驱动开发/examples/scull/../include modules

make[1]: Entering directory `/usr/src/linux-headers-2.6.32-22-generic'

CC [M]  /home/elite/Desktop/linux设备驱动开发/examples/scull/main.o

CC [M]  /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.o

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c: In function‘scull_p_read’:

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:131: error:‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:131: error: (Eachundeclared identifier is reported only once

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:131: error: foreach function it appears in.)

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:131: error:implicit declaration of function ‘signal_pending’

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:131: error:implicit declaration of function ‘schedule’

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c: In function‘scull_getwritespace’:

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:168: error:‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c: In function‘scull_p_write’:

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:219: error:‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:223: error:‘SIGIO’ undeclared (first use in this function)

/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:223: error:‘POLL_IN’ undeclared (first use in this function)

make[2]: *** [/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.o] Error 1

make[1]: *** [_module_/home/elite/Desktop/linux设备驱动开发/examples/scull] Error 2

make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-22-generic'

make: *** [modules] Error 2

TASK_INTERRUPTIBLE找不到,既然前面删除掉了了一个头文件,必然有很多变量找不到,

那就到/usr/src/linux-headers-2.6.32-22-generic下grep一下呗:

最终找到头文件,添加上:

#include

access.c也需要添加上面的头文件。

然后,还得make,痛苦阿。。。。

make -C /lib/modules/2.6.32-22-generic/build M=/home/elite/Desktop/linux设备驱动开发/examples/scull LDDINC=/home/elite/Desktop/linux设备驱动开发/examples/scull/../include modules

make[1]: Entering directory `/usr/src/linux-headers-2.6.32-22-generic'

CC [M]  /home/elite/Desktop/linux设备驱动开发/examples/scull/access.o

/home/elite/Desktop/linux设备驱动开发/examples/scull/access.c: In function‘scull_u_open’:

/home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:107: error:‘struct task_struct’ has no member named ‘uid’

/home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:108: error:‘struct task_struct’ has no member named ‘euid’

/home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:115: error:‘struct task_struct’ has no member named ‘uid’

/home/elite/Desktop/linux设备驱动开发/examples/scull/access.c: In function‘scull_w_available’:

/home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:166: error:‘struct task_struct’ has no member named ‘uid’

/home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:167: error:‘struct task_struct’ has no member named ‘euid’

/home/elite/Desktop/linux设备驱动开发/examples/scull/access.c: In function‘scull_w_open’:

/home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:185: error:‘struct task_struct’ has no member named ‘uid’

make[2]: *** [/home/elite/Desktop/linux设备驱动开发/examples/scull/access.o] Error 1

make[1]: *** [_module_/home/elite/Desktop/linux设备驱动开发/examples/scull] Error 2

make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-22-generic'

make: *** [modules] Error 2

说task_struct结构体没有uid,euid成员变量,struct task_struct定义在include/linux/sched.h中,这主要是由于原来task_struct结构体定义有所改动,将uid和euid等挪到 cred中,见include/linux/sched.h和include/linux/cred.h。

因此只需要将报error的代码做如下修改

current->uid 修改为 current->cred->uid

current->euid 修改为 current->cred->euid

然后编译,即可通过。0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值