将内核模块与预编译对象链接

时间:2014-10-14 11:26:44

标签: c linker kernel-module

我试图构建并插入使用预编译目标文件的内核模块。 预编译的目标文件是用asm(GNU汇编程序)编译的。

这是Makefile:

obj-m += klm.o
klm-objs := a.o
klm.o:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

和klm.c:

#define LINUX

#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/slab.h>
extern volatile unsigned long peak_create();
int init_module(void)
{
   printk("<1>Hello world 1.\n");
   peak_create(); 
   return 0;
}


void cleanup_module(void)
{
  printk(KERN_ALERT "Goodbye world 1.\n");
}  

EXPORT_SYMBOL_GPL(peak_create);
MODULE_LICENSE("GPL");

但是当我尝试插入ko文件时(使用insmod klm.ko),dmesg显示错误:

klm:未知符号peak_create(错误0)

a.o的源文件包含peak_create的全局减速度。 (.globl peak_create)

如何在内核模块中使用peak_create?

谢谢大家!

1 个答案:

答案 0 :(得分:1)

尝试将Makefile修改为:

obj-m := klm_out.o
klm_out-objs : klm.o a.o

modules:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    # Put the asm compilation command here

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    rm -f a.o