fedora14 环境下 编译成模块/

#include <linux/kernel.h>
#include <linux/module.h>
static int __init mini2440_hello_module_init(void)
{
    printk("Hello, Mini2440 module is installed !\n");
    return 0;
}

static void __exit mini2440_hello_module_cleanup(void)
{
    printk("Good-bye, Mini2440 module was removed!\n");
}

module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
以上是driver/char/ mini2440_hello_module.c
如果想想让driver/char/ mini2440_hello_module.c编译成一个模块

在driver/char/目录下必须有 mini2440_hello_module.c这个文件
在driver/char/ Makefile中添加 obj-m+= mini2440_hello_module.o这么一行
然后再源代码根目录下执行
make modules
即可生成driver/char/ mini2440_hello_module.ko

如果继续想让make menuconfig中会出现 mini2440_hello_module的影子
则在driver/char/ Kconfig中添加 类似
config MINI2440_HELLO_MODULE
    tristate "Mini2440 module sample"
    depends on MACH_MINI2440
    default m if MACH_MINI2440
    help
      Mini2440 module sample.

并把上段的driver/char/ Makefile那行 obj-m+= mini2440_hello_module.o 改成
obj-$(CONFIG_MINI2440_HELLO_MODULE)+= mini2440_hello_module.o
这样make menuconfig的配置才会在make modules下管用

上面作法不方便做测试,如果想要将任意一个目录下的.c文件比如/home/mymodule.c编译成一个模块,可以
在/home下创建一个Makefile
内容是

ifneq ($(KERNELRELEASE),)
obj-m := mymodule.o
else
KDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2
#KDIR := /lib/modules/$(uname-r)*/build
all:
    make -C $(KDIR) M=$(PWD) modules
clean:
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
line 2 名字要与mymodule.c对应,写成mymodule.o
line 4 指定源代码所在目录
line 6 PWD,指定源文件mymodule.o.c在当前目录
如果KDIR := /lib/modules/$(uname-r)*/build/
那么编译出的模块便可以运行在本机
在home下执行make,可以生成mymodule.ko
其实这个Makefile是调用的源代码下的Makefile生成的ko

如果是有多个依赖,则Makefile可以如下
ifneq ($(KERNELRELEASE),)  
obj-m:= mymodule.o  
mymodule-objs := file1.o file2.o file3.o  
else      
KDIR := /lib/modules/$(uname-r)*/build/
all:  
    make -C $(KDIR) M=$(PWD) modules  
clean:  
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers *~   modules.order
endif  
/**file1.c**/
#include <linux/kernel.h>  
#include <linux/module.h> 
extern  test2(void);
extern  test3(void);
static int __init mini2440_hello_module_init(void)  
{  
printk("Hello, Mini2440 module is installed !\n");  
test2();
test3();
return 0;  
}  

static void __exit mini2440_hello_module_cleanup(void)  
{  
printk("Good-bye, Mini2440 module was removed!\n");  
}  

module_init(mini2440_hello_module_init);  
module_exit(mini2440_hello_module_cleanup);  
MODULE_LICENSE("GPL");  
/**file2.c**/
#include <linux/kernel.h>  
void test2(void)
{
printk("test2\n");
}
/**file3.c**/
#include <linux/kernel.h>  
void test3(void)
{
printk("test3 \n");
}
执行make,即可生成mymodule.ko
加载用insmod mymodule.ko
或modprobe mymodule(此命令需要将ko考到/lib/modules/linuxxxx下)
卸载用 rmmod mymodule
查看用lsmod

注意:上面的Makefile中,
①写成obj-y := mymodule.o或obj- := mymodule.o,执行make均不会生成file1.o,file2.o,file3.o,mymodule,ko
②写成obj-m:= mymodule.o,make时会生成file1.o,file2.o,file3.o,mymodule.ko

obj-m := mymodule.o 和mymodule-objs := file1.o file2.o file3.o,名字需要对应,生成mymodule.ko,又如
obj-m := song.o 和song-objs := file1.o file2.o file3.o,生成song.ko

此外还有
obj-m := song.o 和song-y:= file1.o file2.o file3.o

看一下.o和.ko的哪里不同
代码段一样
[root@localhost test]# arm-linux-objdump -S  mymodule.ko 

mymodule.ko:     file format elf32-littlearm

Disassembly of section .exit.text:

00000000 <cleanup_module>:
   0:	e1a0c00d 	mov	ip, sp
   4:	e92dd800 	push	{fp, ip, lr, pc}
   8:	e24cb004 	sub	fp, ip, #4	; 0x4
   c:	e59f0004 	ldr	r0, [pc, #4]	; 18 <cleanup_module+0x18>
  10:	ebfffffe 	bl	0 <printk>
  14:	e89da800 	ldm	sp, {fp, sp, pc}
  18:	00000000 	.word	0x00000000
Disassembly of section .init.text:

00000000 <init_module>:
   0:	e1a0c00d 	mov	ip, sp
   4:	e92dd800 	push	{fp, ip, lr, pc}
   8:	e24cb004 	sub	fp, ip, #4	; 0x4
   c:	e59f0008 	ldr	r0, [pc, #8]	; 1c <init_module+0x1c>
  10:	ebfffffe 	bl	0 <printk>
  14:	e3a00000 	mov	r0, #0	; 0x0
  18:	e89da800 	ldm	sp, {fp, sp, pc}
  1c:	00000028 	.word	0x00000028
[root@localhost test]# arm-linux-objdump -S  mymodule.o 

mymodule.o:     file format elf32-littlearm

Disassembly of section .exit.text:

00000000 <cleanup_module>:
   0:	e1a0c00d 	mov	ip, sp
   4:	e92dd800 	push	{fp, ip, lr, pc}
   8:	e24cb004 	sub	fp, ip, #4	; 0x4
   c:	e59f0004 	ldr	r0, [pc, #4]	; 18 <cleanup_module+0x18>
  10:	ebfffffe 	bl	0 <printk>
  14:	e89da800 	ldm	sp, {fp, sp, pc}
  18:	00000000 	.word	0x00000000
Disassembly of section .init.text:

00000000 <init_module>:
   0:	e1a0c00d 	mov	ip, sp
   4:	e92dd800 	push	{fp, ip, lr, pc}
   8:	e24cb004 	sub	fp, ip, #4	; 0x4
   c:	e59f0008 	ldr	r0, [pc, #8]	; 1c <init_module+0x1c>
  10:	ebfffffe 	bl	0 <printk>
  14:	e3a00000 	mov	r0, #0	; 0x0
  18:	e89da800 	ldm	sp, {fp, sp, pc}
  1c:	00000028 	.word	0x00000028
[root@localhost test]# 

refer to
国嵌视频
http://blog.csdn.net/songqqnew/article/details/6762566
ldd3-2.4

你可能感兴趣的:(c,Module,File,include,FP,makefile)