博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过make编译多文件的内核模块
阅读量:4005 次
发布时间:2019-05-24

本文共 2051 字,大约阅读时间需要 6 分钟。

转载至:

之前对make的使用都仅局限于单个文件,比如用make编译单个文件的内核模块。我试着将一个程序分解成多个文件,然后再通过make进行多文件的编译,途中还是遇到一些列问题,因此总结成下文。

1.文件清单

下面的文件清单类出的是一个内核模块程序,我们这里不去深究这个模块的功能。procfs_mod.c主要包含内核模块程序的主要框架,比如加载函数和卸载函数等;procfs.c包含主要的函数的实现;而procfs.h是整个程序所用到的头文件,包含函数以及变量的声明等。

1 edsionte@edsionte-desktop:~/proc_vfs$ ls
2 Makefile  procfs.c  procfs.h  procfs_mod.c

2.Makefile的组成

我们可以将Makefile看作是编译规则集合,它告诉make应该如何进行编译,最终生成目标文件。

1 edsionte@edsionte-desktop:~/proc_vfs$ cat Makefile
2 obj-m += myprocfs.o
3 myprocfs-objs := procfs.o procfs_mod.o
4  
5 all:
6     make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
7 clean:
8     make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

在这个Makefile中,obj-m说明最终生成的内核模块目标文件是myprofs.ko,并且它必须依赖两个文件procfs.c和procfs_mod.c。因此,通过模块名加-objs的形式可以定义整个模块所包含的文件。注意,这里定义的都是与原文件同名的目标文件。

3.头文件的引用

在本文所举例的源程序中,procfs.h包含了整个程序所需要的函数以及变量,也即是说所有.c的源程序都会引用该头文件。为了防止头文件被多次重复引用,我们应该在头文件中使用条件编译。

1 edsionte@edsionte-desktop:~/proc_vfs$ cat procfs.h
2 #ifndef _MY_PROC_FS_H
3 #define _MY_PROC_FS_H
4  
5 #include
6 …………
7 #endif

也就是将整个头文件的内容用头文件包围起来。上面的条件编译说明:如果没有定义符号常量_MY_PROC_FS_H,就定义该变量并且包含该头文件。

但是,即便我在头文件中使用了条件编译,在编译时还是出现了下面的错误:

1 edsionte@edsionte-desktop:~/proc_vfs$ make
2 make -C /lib/modules/2.6.32-24-generic/build M=/home/edsionte/proc_vfs modules
3 make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-24-generic'
4   CC [M]  /home/edsionte/proc_vfs/procfs.o
5   CC [M]  /home/edsionte/proc_vfs/procfs_mod.o
6   LD [M]  /home/edsionte/proc_vfs/myprocfs.o
7 /home/edsionte/proc_vfs/procfs_mod.o:(.bss+0x820): multiple definition of `my_proc_file'
8 /home/edsionte/proc_vfs/procfs.o:(.bss+0x820): first defined here
9 /home/edsionte/proc_vfs/procfs_mod.o:(.data+0x80): multiple definition of `my_inode_ops'
10 /home/edsionte/proc_vfs/procfs.o:(.data+0x80): first defined here
11 make[2]: *** [/home/edsionte/proc_vfs/myprocfs.o] 错误 1
12 make[1]: *** [_module_/home/edsionte/proc_vfs] 错误 2
13 make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-24-generic'
14 make: *** [all] 错误 2

产生这种错误的原因是我之前一直在头文件对一些全局变量进行定义,这样导致进行了多次定义。正确的做法是在某一个.c中进行全局变量的定义,而在.h文件中使用extern进行外部即可。

你可能感兴趣的文章
coursesa课程 Python 3 programming 排序函数sorted的可选参数
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
visca接口转RS-232C接口线序
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
关于共享单车定位不准问题
查看>>
终于搞定CString和string之间转换的问题了
查看>>
用防火墙自动拦截攻击IP
查看>>
补充自动屏蔽攻击ip
查看>>
通信和通讯有什么区别?
查看>>
谷歌走了
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
让我做你的下一行Code
查看>>
浅析:setsockopt()改善程序的健壮性
查看>>
关于对象赋值及返回临时对象过程中的构造与析构
查看>>
VS 2005 CRT函数的安全性增强版本
查看>>