gpt4 book ai didi

linux - 加载内核模块时出现未知符号,但该符号已在内核中导出

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:08 24 4
gpt4 key购买 nike

我正在编写一个内核模块来操纵 GPIO。在初始化时,模块需要更改 GPIO 的复用。

[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)

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

猫/proc/kallsyms | grep omap_mux_set_gpio

确实存在名为 omap_mux_set_gpio 的函数。

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

正确的做法是什么?

非常感谢。

最佳答案

如果一个符号没有被标记为EXPORT_SYMBOLEXPORT_SYMBOL_GPL,那么你不能在内核模块中使用它。该符号似乎没有以那种方式标记。

关于linux - 加载内核模块时出现未知符号,但该符号已在内核中导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9132258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com