加载内核模块时的未知符号,但符号在内核中导出

时间:2012-02-03 16:50:01

标签: linux kernel-module

我正在编写一个内核模块来操作GPIO。在初始化中,模块需要更改GPIO的muplex。

[tld.c]

#include <mach-omap2/mux.h>

。 。

int open_gpio(void){
    int result;
    result = gpio_request_array(leds_gpios, ARRAY_SIZE(leds_gpios));
    if(result != 0) {
        printk("tld: cannot request gpio ports\n");
    }

    result = gpio_direction_output(LED_LE_PIN, 0);

    omap_mux_set_gpio(OMAP_MUX_MODE7, LED_LE_PIN);
    if(result != 0) {
        printk("tld: cannot change GPIO muplex.\n");
        gpio_free_array(leds_gpios, ARRAY_SIZE(leds_gpios));
    }
    return result;
} 

static int tld_init(void) { 
        .
        .
    /* open gpio ports */
    result = open_gpio();
        .
        .
}
    .
module_init(tld_init);
    .

函数omap_mux_set_gpio()在Kernel_Source / arch / arm / mach-omap2 / mux.h中声明。所以我将它包含在源文件中。

Makefile也是自定义的。

[生成文件]

CONFIG_CROSS_COMPILE =
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

ARCH        ?= arm

SOURCE_DIR ?= /home/me/kerner_source

AS      = $(CROSS_COMPILE)as
LD      = $(CROSS_COMPILE)ld
CC      = $(CROSS_COMPILE)gcc
CPP     = $(CC) -E
AR      = $(CROSS_COMPILE)ar
NM      = $(CROSS_COMPILE)nm
STRIP       = $(CROSS_COMPILE)strip
OBJCOPY     = $(CROSS_COMPILE)objcopy
OBJDUMP     = $(CROSS_COMPILE)objdump

obj-m += tld.o
ccflags-y += -I$(SOURCE_DIR)/arch/arm


all:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(SOURCE_DIR) M=$(PWD) modules

clean:
rm *.o *.ko *.mod.*

我可以编译但是有警告:

警告:“omap_mux_set_gpio”[/home/me/projects/tld.ko]未定义!

当我运行insmod时,dmesg中存在错误:

tld:未知符号omap_mux_set_gpio(错误0)

我通过运行来检查内核符号列表:

cat / proc / kallsyms | grep omap_mux_set_gpio

确实存在一个名为omap_mux_set_gpio的函数。

我认为我包含头文件的方式可能导致问题。 mux.h属于内核本身,但我把它视为外部的。

做正确的方法是什么?

非常感谢。

1 个答案:

答案 0 :(得分:1)

如果符号未标记为EXPORT_SYMBOLEXPORT_SYMBOL_GPL,则无法在内核模块中使用它。此符号似乎没有以这种方式标记。