Linux模块编译命令 linux编译内核模块两种方式( 三 )


a.outhellohello.c
执行:
[root@localhost c]# ./hello
Hello, World!
注意:使用-o选项时,-o后面必须跟一个文件名,即:-o outfile 。
为了便于描述后面的选项,删除hello和a.out可执行文件 。
如何编译一个linux下的驱动模块首先,我们要了解一下模块是如何别被构造的 。模块的构造过程与用户空间
的应用程序的构造过程有显著不同;内核是一个大的、独立的程序
,
对于它的各
个部分如何组合在一起有详细的明确的要求 。
Linux2.6
内核的构造过程也与以
前版本的内核构造过程不同;
新的构造系统用起来更加简单,
并且可产生更加正
确的结果
,
但是它看起来和先前的方法有很大不同 。内核的构造系统非常复杂
,
我们所看到的只是它的一小部分 。
如果读者想了解更深入的细节,
则应阅读在内
核源码中的
Document/kbuild
目录下的文件 。
在构造内核模块之前,
有一些先决条件首先应该得到满足 。
首先,
读者要保证你
有适合于你的内核版本的编译器、模块工具
,
以及其他必要工具 。在内核文档目
录下的文件
Documentation/Changes
里列出了需要的工具版本;
在开始构造内
核前,
读者有必要查看该文件,
并确保已安装了正确的工具 。
如果用错误的工具
版本来构造一个内核
(
及其模块
)
,可能导致许多奇怪的问题 。另外也要注意
,
使
用太新版本的编译器偶尔可能也会导致问题 。
一旦做好了上面的准备工作之后
,
其实给自己的模块创建一个
makefile
则非常
简单 。实际上
,
对于本章前面展示的
" hello world"
例子
,
下面一行就够了
:
obj-m := hello.o
如果读者熟悉
make

但是对
Linux2.6
内核构造系统不熟悉的话
,
可能奇怪这个
makefile
如何工作 。毕竟上面的这一行不是一个传统的
makefile
的样子 。问
题的答案当然是内核构造系统处理了余下的工作 。上面的赋值语句
(
它利用了由
GNU make
提供的扩展语法
)
说明有一个模块要从目标文件
hello.o
构造,而从
该目标文件构造的模块名称为
hello.ko.
如果我们想由两个源文件
(
比如
file1.c

file2.c )
构造出一个名称为
module.ko
的模块
,
则正确的
makefile
可如下编写
:
obj-m := module.o
module-objs := file1.o file2.o
为了让上面这种类型的
makefile
文件正常工作
,
必须在大的内核构造系统环境
中调用他们 。假设读者的内核源码数位于
~/kernel-2.6
目录
,
用来建立你的模
块的
make
命令
(
在包含模块源代码和
makefile
的目录下键入
)
应该是
:
make -C ~/kernel-2.6 M=`pwd` modules
这个命令首先是改变目录到用
-C
选项指定的位置
(
即内核源代码目录
)
,其中保
存有内核的顶层
makefile
文件 。这个
M=
选项使
makefile
在构造
modules

标前
,
返回到模块源码目录 。
然后,
modules
目标指向
obj-m
变量中设定的模块,
【Linux模块编译命令 linux编译内核模块两种方式】

推荐阅读