具有多个文件的内核模块 - 未知符号

时间:2013-05-22 21:12:27

标签: linux module kernel undefined-symbol loadmodule

Hello stackoverflowers:)

在过去的几个小时里,我一直在尝试编译+加载多个文件模块。编译发出奇怪的警告,模块无法加载。这是模块,Makefile,编译输出和dmesg。

头:

// header.h

#ifndef _HEADER_H
#define _HEADER_H
void do_module_func(void);
void do_other_func(void);
#endif

'main'模块文件:

//mymodule.c

#include <linux/module.h>
#include <linux/kernel.h>
#include "header.h"

void do_module_func(void)
{
    printk(KERN_INFO "module_func\n");
}

static int mymodule_init(void)
{
    printk(KERN_INFO "Hello world\n");
    do_other_func();
    return 0;
}
module_init(mymodule_init);


static void mymodule_exit(void)
{
    printk(KERN_INFO "Goodbye, cruel world\n");
}
module_exit(mymodule_exit);

MODULE_LICENSE("GPL")

其他c文件,它调用位于“main”模块中的do_module_func()

//other_file.c

#include "header.h"
#include <linux/kernel.h>

void do_other_func(void)
{
    printk(KERN_INFO "other_func\n");
    do_module_func();
}

生成文件

//Makefile

obj-m := mymodule.o
mymodule-objs := other_file.o

CROSS:=arm-unknown-linux-gnueabi-
KERNEL:= ~/work/linux-davinci-2.6.38/
ARCH:=arm

PWD:=$(shell pwd)

all:
    $(MAKE) CROSS_COMPILE=$(CROSS) ARCH=$(ARCH) -C $(KERNEL) M=$(PWD) modules

clean:
    $(MAKE) CROSS_COMPILE=$(CROSS) ARCH=$(ARCH) -C $(KERNEL) M=$(PWD) clean

我正在编译,但我相信这应该不是问题。 输出:

make CROSS_COMPILE....
make[1]: Entering directory .../linux-davinci-2.6.38
  CC [M] .../other_file.o
  LD [M] .../mymodule.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "do_module_func" [.../mymodule.o] undefined! <--- warning here
  CC .../mymodule.mod.o
  LD [M] .../mymodule.ko
make[1]: Leaving directory .../linux-davinci-2.6.38

insmod输出:

can't insert 'mymodule.ko': unknown symbol in module, or unknown parameter

dmesg的:

mymodule: Unknown symbol do_mdule_func (err 0)

因此模块会编译(链接?)警告,模块不会加载。

现在,我看到在make输出中,在编译other_file.c之后似乎有一个链接尝试,但是在链接之前不应该有mymodule.c的编译吗?

谢谢! :)

3 个答案:

答案 0 :(得分:7)

原来问题出现在Makefile中。 “技巧”是您在obj-m中定义将被编译的模块(转换为.ko),并在-objs中定义所有源文件。
因此,此Makefile中的定义转为:

obj-m := moduleko.o
moduleko-objs := other_file.o mymodule.o

并将其编译为moduleko.ko。

答案 1 :(得分:0)

这是因为file_2需要file_1符号引用,用于将file_2构建为LKM。 要解决此问题,请构建file_1(LKM)并将file_1的Module.symvers放在file_2位置。并再次构建file_2。

答案 2 :(得分:-1)

all:
    $(MAKE) CROSS_COMPILE=$(CROSS) ARCH=$(ARCH) -C $(KERNEL) M=$(PWD) modules
instead try like this
     $(MAKE) -C  $(KERNEL) ARCH=$(ARCH)  CROSS_COMPILE=$(CROSS) M=$(PWD) /
          this will run each file and links with object.hope this would solve your problem