ubuntu 1204 kernel 3.2编译ldd3 scull

由于linux内核版本的升级,往往会让能在老版本内核上编译通过的驱动程序移植到新版本内核中出现各种编译和链接错误,这里就将我遇到的一些问题做个整理,让后续开发更流畅^_^!

当前内核版本为3.2.4


1.make[1]: Entering directory `/usr/src/linux-***' scripts/Makefile.build:49: *** CFLAGS was changed in "***/Makefile". Fix it to use ***. Stop.

原因:与Makefile.build中的CFLAGS冲突

建议:删除CFLAGS或者将CFLAGS重命名


2. fatal error: linux/config.h: No such file or directory

原因:linux-2.6.20起,linux/config.h被移除了

建议:可以添加如下代码

#if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18))

#if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33))

#include <generated/autoconf.h>

#else

#include <linux/autoconf.h>

#endif

#else

#include <linux/config.h>

#endif


3. error: unknown field ‘ioctl’ specified in initializer

原因:linux-2.6.26起,file_operations修改了,移除了ioctl,添加了如下两个接口

long(*unlocked_ioctl)(structfile *, unsignedint,unsignedlong);

long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
建议:视程序使用情况,把.ioctl修改成为.unlocked_ioctl或者compat_ioctl


4 error: implicit declaration of function ‘init_MUTEX’

原因:linux-2.6.25起,移除init_MUTEX,init_MUTEX_LOCKED宏定义

建议:添加如下代码

#include <linux/semaphore.h>

#define init_MUTEX(a) sema_init(a,1)

#define init_MUTEX_LOCKED(a) sema_init(a,0)


5. error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)

原因:linux-2.6.19起,TASK_INTERRUPTIBLE的定义被移动到linux/sched.h

建议:添加头文件 linux/sched.h


6. error: ‘SPIN_LOCK_UNLOCKED’ undeclared here

原因:新版本内核中,SPIN_LOCK_UNLOCKED被移除

建议:使用DEFINE_SPINLOCK(lock)宏来替代


7. error: ‘struct task_struct’ has no member named ‘uid’/ ‘euid’

原因:linux-2.6.31起,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值