Linux核心2.4和2.6編譯模組的方法
/*filename: test.c*/ |
執行如下命令:
$ gcc -c -O2 -DMODULE -D__KERNEL__ -I/usr/src/linux test.c |
正確的做法是寫一個Makefile,由核心的Kbuild來幫你編譯。
#filename: Makefile obj-m := test.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules |
執行如下命令:
$make |
其實上邊的test.o就是用gcc生成的test.o,而test.ko是使用下列命令來生成的。
$ld -m elf_i386 -r -o test.ko test.o test.mod.o |
再來看看test.mod.c,它是由/usr/src/linux/scripts/modpost.c來生成的。
$ cat test.mod.c |
可見,test.mod.o只是產生了幾個ELF的節,分別是modinfo, .gun.linkonce.this_module(用於重定位,引進了rel.gnu.linkonce.this_module), __versions。而test.ko是test.o和test.mod.o合併的結果。