"未知符号"在' insmod' module1调用module2中声明的函数

时间:2017-09-11 12:03:40

标签: linux-kernel

我是linux内核的新手。目前我希望有2个模块可以互相交互。我试图通过EXPORT_SYMBOL_GPL从module1中的module2调用function2。当我'insmod' module1它告诉我function2是"未知符号"到module1。我做了导出function2并在Makefile中添加-DEXPORT_SYMTAB。还有什么我想念的?任何建议都非常欣赏。

这是我的问候

/*  *************************************************************************************

 *  hello-1.c - The simplest kernel module.
 */
#include <linux/module.h>    /* Needed by all modules */
#include <linux/kernel.h>    /* Needed for KERN_INFO */
#include "hello2.h"

static int __init init_module1(void)
{
    printk(KERN_INFO "Hello world 1.\n");
    function2();
    /*
     * A non 0 return means init_module failed; module can't be loaded.
     */
    return 0;
}

static void __exit cleanup_module1(void)
{
    printk(KERN_INFO "Goodbye world 1.\n");
}

module_init(init_module1);
module_exit(cleanup_module1);

MODULE_DESCRIPTION("Hello1");

MODULE_LICENSE("GPL");


/*  *************************************************************************************

 *  hello-2.c - The simplest kernel module.
 */
#include <linux/module.h>    /* Needed by all modules */
#include <linux/kernel.h>    /* Needed for KERN_INFO */

static void function2 (void)
{
    printk(KERN_INFO "Function called in hello2.\n");
}
EXPORT_SYMBOL_GPL(function2);

static int __init init_module2(void)
{
    printk(KERN_INFO "Hello world 2.\n");

    /*
     * A non 0 return means init_module failed; module can't be loaded.
     */
    return 0;
}

static void __exit cleanup_module2(void)
{
    printk(KERN_INFO "Goodbye world 2.\n");
}

module_init(init_module2);
module_exit(cleanup_module2);

MODULE_DESCRIPTION("Hello2");

MODULE_LICENSE("GPL");

/*  *************************************************************************************

 *  hello-2.h - The simplest kernel module header
 */

extern void function2 (void);

################################################
# Makefile for hello2
PWD          := $(shell pwd)
KVERSION    := $(shell uname -r)
KDIR     := /lib/modules/$(shell uname -r)/build
KERNEL_DIR    := /usr/src/linux-headers-$(KVERSION)/
INSTALL_PATH := /lib/modules/$(shell uname -r)/extra
EXTRA_CFLAGS = -DEXPORT_SYMTAB

MODULE_NAME    = hello2
obj-m        := hello2.o

#.PHONY: all clean insert
.PHONY: all clean
all:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
    $(MAKE) -C $(KDIR) M=$(PWD) clean
    rm -rf *.o *.ko *.mod.* .c* .t*
insert:
    $(MAKE) INSTALL_MOD_DIR=$(INSTALL_PATH) -C $(KDIR) M=$(PWD) modules_install

2 个答案:

答案 0 :(得分:0)

hello-2.c中你有:

static void function2 (void)
{
    ...
}

请考虑将其设为非静态

void function2(void)
{
    ...
}

答案 1 :(得分:0)

我从旧帖子中找到了解决方案: insmod fails with "Unknown symbol in module" for a symbol defined in another module

原来需要同时构建2个模块。我用2个不同的Makefile分别构建它们。