linux has no member named 编译出错,ldd源码编译出现的问题

For the "Linux device driver III", the example of "chapter 4":

Delete the

Add the

Ok, now change into its derectory and complile it like this:

CFLAGS was changed in "/root/Desktop/examples/scull/Makefile". Fix it to use EXTRA_CFLAGS. Stop.

make[1]: *** [_module_/root/Desktop/examples/scull] Error 2

make[1]: Leaving directory `/usr/src/kernels/2.6.24.2-2lp-i686‘

make: *** [modules] Error 2

There are two kind of method to solve this problem:

(1)Rplace all CFLAGS with EXTRA_CFLAGS in the Makefile.

(2)Using the KBUILD_NOPEDANTIC arg

[[email protected] scull]# make KBUILD_NOPEDANTIC=1

make -C /lib/modules/2.6.24.2-2lp/build M=/root/Desktop/examples/scull LDDINC=/root/Desktop/examples/scull/../include modules

make[1]: Entering directory `/usr/src/kernels/2.6.24.2-2lp-i686‘

CC [M] /root/Desktop/examples/scull/main.o

CC [M] /root/Desktop/examples/scull/pipe.o

CC [M] /root/Desktop/examples/scull/access.o

LD [M] /root/Desktop/examples/scull/scull.o

Building modules, stage 2.

MODPOST 1 modules

CC      /root/Desktop/examples/scull/scull.mod.o

LD [M] /root/Desktop/examples/scull/scull.ko

make[1]: Leaving directory `/usr/src/kernels/2.6.24.2-2lp-i686‘

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

$ make

make -C /lib/modules/2.6.18-1.2798a_FC6/build SUBDIRS=/home/njc/stuff/linux-labjack/driver/linux-2.6 modules

make[1]: Entering directory `/usr/src/redhat/BUILD/kernel-2.6.181.2798a_FC6‘

CC [M] /home/njc/stuff/linux-labjack/driver/linux-2.6/labjack.o

/home/njc/stuff/linux-labjack/driver/linux-2.6/labjack.c:43:26: error: linux/config.h: No such file or directory

make[2]: *** [/home/njc/stuff/linux-labjack/driver/linux-2.6/labjack.o] Error 1

make[1]: *** [_module_/home/njc/stuff/linux-labjack/driver/linux-2.6] Error 2

make[1]: Leaving directory `/usr/src/redhat/BUILD/kernel-2.6.181.2798a_FC6‘

make: *** [default] Error 2

A solution, which I based from a discussion in this bloghttp://www.phoronix.com/redblog/?p=blog&i=NTUwMA, would be to copy a config.h header file to your /lib/modules/KERNEL-VERSION/build/include/linux directory. If you have a previous kernel build on your computer you can copy the file from your /lib/modules/OLD-KERNEL-VERSION/build/include/linux directory. Alternatively you can just copy the code below into a self made config.h file

CODE

#ifndef _LINUX_CONFIG_H

#define _LINUX_CONFIG_H

#include

#endif

错误:

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c: In function ‘scumm_open‘:

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c:54: error: dereferencing pointer to incomplete type

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c:54: error: dereferencing pointer to incomplete type

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c: In function ‘scumm_release‘:

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c:96: error: dereferencing pointer to incomplete type

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c:96: error: dereferencing pointer to incomplete type

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c: In function ‘scumm_read‘:

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c:140: error: dereferencing pointer to incomplete type

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c:140: error: dereferencing pointer to incomplete type

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c: In function ‘scumm_write‘:

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c:210: error: dereferencing pointer to incomplete type

/home/lingd/arm2410s/ldd3/chapter4/scumm/scumm.c:210: error: dereferencing pointer to incomplete type

出错语句:

printk(KERN_DEBUG "\"%s(pid %d)\" open scumm device!\n", current->comm, current->pid);

宏current定义在arch/arm/include/asm/current.h中,

static inline struct task_struct *get_current(void)

{

return current_thread_info()->task;

}

#define current (get_current())

出错原因:

编译器不知道task_struct的具体定义,因此,无法解引用current,无法获知其成员comm、pid的类型,才报“dereferencing pointer to incomplete type”

task_struct定义在中。在源文件头,加上#include ,即可解决问题!

“dereferencing pointer to incomplete type”错误,大多也是因为不知道struct/class/emun/union等的定义而引起的

4、‘struct task_struct‘ has no member named ‘uid‘

/home/jqzeng/workSpace/ldd3/ldd3-samples-1.0.0/scull/access.c:107:29: error: ‘struct task_struct‘ has no member named ‘uid‘

/home/jqzeng/workSpace/ldd3/ldd3-samples-1.0.0/scull/access.c:108:29: error: ‘struct task_struct‘ has no member named ‘euid‘

原因:新的struct task_struct 定义有变化,uid和euid在cred结构体中。

解决办法:加头文件cred.h,将 current->uid改为current->cred->uid,current->euid改为current->cred->euid

#include

108         if (scull_u_count &&

109                         (scull_u_owner != current->cred->uid) &&  /* allow user */

110                         (scull_u_owner != current->cred->euid) && /* allow whoever did su */

...

117                 scull_u_owner = current->cred->uid; /* grab it */