fedora14 环境下 编译成模块/

来源:互联网 发布:arm linux gcc安装包 编辑:程序博客网 时间:2024/04/28 01:12
#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.oelseKDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2#KDIR := /lib/modules/$(uname-r)*/buildall:    make -C $(KDIR) M=$(PWD) modulesclean:    rm -f *.ko *.o *.mod.o *.mod.c *.symversendif
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.orderendif  
/**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-littlearmDisassembly of section .exit.text:00000000 <cleanup_module>:   0:e1a0c00d movip, sp   4:e92dd800 push{fp, ip, lr, pc}   8:e24cb004 subfp, ip, #4; 0x4   c:e59f0004 ldrr0, [pc, #4]; 18 <cleanup_module+0x18>  10:ebfffffe bl0 <printk>  14:e89da800 ldmsp, {fp, sp, pc}  18:00000000 .word0x00000000Disassembly of section .init.text:00000000 <init_module>:   0:e1a0c00d movip, sp   4:e92dd800 push{fp, ip, lr, pc}   8:e24cb004 subfp, ip, #4; 0x4   c:e59f0008 ldrr0, [pc, #8]; 1c <init_module+0x1c>  10:ebfffffe bl0 <printk>  14:e3a00000 movr0, #0; 0x0  18:e89da800 ldmsp, {fp, sp, pc}  1c:00000028 .word0x00000028
[root@localhost test]# arm-linux-objdump -S  mymodule.o mymodule.o:     file format elf32-littlearmDisassembly of section .exit.text:00000000 <cleanup_module>:   0:e1a0c00d movip, sp   4:e92dd800 push{fp, ip, lr, pc}   8:e24cb004 subfp, ip, #4; 0x4   c:e59f0004 ldrr0, [pc, #4]; 18 <cleanup_module+0x18>  10:ebfffffe bl0 <printk>  14:e89da800 ldmsp, {fp, sp, pc}  18:00000000 .word0x00000000Disassembly of section .init.text:00000000 <init_module>:   0:e1a0c00d movip, sp   4:e92dd800 push{fp, ip, lr, pc}   8:e24cb004 subfp, ip, #4; 0x4   c:e59f0008 ldrr0, [pc, #8]; 1c <init_module+0x1c>  10:ebfffffe bl0 <printk>  14:e3a00000 movr0, #0; 0x0  18:e89da800 ldmsp, {fp, sp, pc}  1c:00000028 .word0x00000028[root@localhost test]# 
refer to
国嵌视频
http://blog.csdn.net/songqqnew/article/details/6762566
ldd3-2.4