红联Linux门户
Linux帮助

在ubuntu 14.04.3 LTS下调试ldd的scull代码

发布时间:2015-12-25 10:30:57来源:linux网站作者:marvin.li

操作系统版本

root@ubuntu:~/vm_disk_dpdk/study/drive/examples/scull# sudo lsb_release -a

No LSB modules are available.

Distributor ID: Ubuntu

Description:    Ubuntu 14.04.3 LTS
Release:        14.04
Codename:       trusty
root@ubuntu:~/vm_disk_dpdk/study/drive/examples/scull# uname -a
Linux ubuntu 3.13.0-66-generic #108-Ubuntu SMP Wed Oct 7 15:20:27 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux


问题一:scripts/Makefile.build:49: *** CFLAGS was changed in "/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/Makefile". Fix it to use ccflags-y.  Stop.

change
CFLAGS += $(PSTN_DEF) -Wall -O $(INCLUDES) -fno-common -DTARGET_CATAWBA
to
EXTRA_CFLAGS += $(PSTN_DEF) -Wall -O $(INCLUDES) -fno-common -DTARGET_CATAWBA
and try

you could use something like this:
sed -i 's/^CFLAGS/EXTRA_CFLAGS/' Makefile


问题二:/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/main.c:17:26: fatal error: linux/config.h: No such file or directory

现在不用config.h,而是autoconf.h

root@ubuntu:/usr/src/linux-headers-3.13.0-66-generic/include/linux# ln -s ../generated/autoconf.h config.h
root@ubuntu:/usr/src/linux-headers-3.13.0-66-generic/include/linux# ll config.h
lrwxrwxrwx 1 root root 23 Dec 10 01:01 config.h -> ../generated/autoconf.h


问题三:/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/main.c:32:46: fatal error: asm/system.h: No such file or directory

直接注释,有问题后面接着加别的头文件

This file was removed in Linux 3.4, commit f05e798ad4c0; its contents have been moved into various other headers.

It's possible that just removing the #include <asm/system.h> might work, but it's much more likely that your driver is simply incompatible with current Linux versions.


问题四:/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/main.c:556:2: error: unknown field ‘ioctl’ specified in initializer

这个错误网上搜索发现2.6.38版本内核 file_operation结构体已经删除了ioctl函数,取代的是:
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
file_operation结构体在 include/linux/fs.h定义
解决方案:
替换为unlocked_ioctl 即可,注意函数原型,第一个参数不需要(代码中没用到),还有返回值为long类型。


问题五:/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/main.c:652:3: error: implicit declaration of function ‘init_MUTEX’ [-Werror=implicit-function-declaration]

2.6.25及以后的linux内核版本废除了init_MUTEX函数,新版本使用sema_init函数

static inline void init_MUTEX (struct semaphore *sem) 

sema_init(sem, 1); 


问题六:include/linux/wait.h:307:31: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)

增加头文件:#include <linux/sched.h>


问题七:/usr/src/linux-source-3.2.0/drivers/scull/access.c:98:34: error: ‘SPIN_LOCK_UNLOCKED’未声明(不在函数内)

将:static spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED;
改为:static DEFINE_SPINLOCK(scull_u_lock);


问题八:

/usr/src/linux-source-3.2.0/drivers/scull/access.c:107:29: 错误: 提领指向不完全类型的指针
解决办法是在access.c中就加入两个头文件 #include<linux/sched.h>


问题九:‘struct task_struct’ has no member named ‘uid’、‘euid’

/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/access.c:107:29: error: ‘struct task_struct’ has no member named ‘uid’
/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/access.c:108:29: error: ‘struct task_struct’ has no member named ‘euid’

current->uid 修改为 current->cred->uid.val
current->euid 修改为 current->cred->euid.val


编译OK:

root@ubuntu:~/vm_disk_dpdk/study/drive/examples/scull# ls
access.c  main.c  Makefile       Module.symvers  pipe.o   scull.init  scull_load   scull.mod.o  scull_unload
access.o  main.o  modules.order  pipe.c          scull.h  scull.ko    scull.mod.c  scull.o


Linux程序分析工具:ldd和nm:http://www.linuxdiyf.com/linux/6546.html

Linux Shell脚本Ldd命令原理及使用方法:http://www.linuxdiyf.com/linux/460.html

教会你什么是Linux ldd:http://www.linuxdiyf.com/linux/425.html