linux - 来自内核模块(dm9601 驱动程序)的 "Unknown symbol",这是否需要重建内核?

标签 linux linux-kernel kernel-module

这适用于运行内核版本 2.6.21.5 的路由器。

我使用的是官方 (netgear) 源代码树和工具链。

我已经使用工具链编译了 dm9601.c 驱动程序(来自源代码树),但是在插入模块 dmesg 后打印:

dm9601: Unknown symbol mii_link_ok
dm9601: Unknown symbol bitrev32
dm9601: Unknown symbol mii_check_media
dm9601: Unknown symbol usbnet_get_settings
dm9601: Unknown symbol crc32_le
dm9601: Unknown symbol mii_nway_restart
dm9601: Unknown symbol usbnet_nway_reset
dm9601: Unknown symbol generic_mii_ioctl
dm9601: Unknown symbol usbnet_set_settings
dm9601: Unknown symbol mii_ethtool_gset

引用(看起来)

./lib/crc32.c
./lib/bitrev.c
./drivers/net/mii.c
./drivers/usb/net/usbnet.c

有什么方法可以判断这些缺失的依赖项是否需要重建内核。或者我可以用驱动程序加载它们吗?

生成文件:

obj-m += dm9601.o

all:
        make -C /home/chris/DGND3300_V1.1.00.41_NA_src M=$(PWD) modules

clean:
        make -C /home/chris/DGND3300_V1.1.00.41_NA_src M=$(PWD) clean

制作命令:

make ARCH=mips CROSS_COMPILE="/home/chris/EVG2000_v2.2.0.12_with_toolchain_src/uclibc-crosstools-gcc-4.2.3-3/usr/bin/mips-linux-uclibc-"

更新的 Makefile 缺少模块:

obj-m += crc32.o
obj-m += bitrev.o
obj-m += mii.o
obj-m += usbnet.o
obj-m += dm9601.o

all:
        make -C /home/chris/messabout3/DGND3300_V1.1.00.41_NA_src/kernel/linux M=$(PWD) modules

clean:
        make -C /home/chris/messabout3/DGND3300_V1.1.00.41_NA_src/kernel/linux M=$(PWD) clean

最佳答案

首先检查,如果符号是内核符号列表的一部分,

例如:cat/proc/kallsyms | grep mii_link_ok

如果符号不存在,则需要使用 EXPORT_SYMBOL() 或 EXPORT_SYMBOL_GPL() 导出这些符号。

如果存在符号,请尝试以下操作之一,

  1. 在将使用导出函数或变量的内核模块的 Makefile 中包含 **KBUILD_EXTRA_SYMBOLS=<"导出函数或变量的内核模块的 Module.symvers 的绝对路径">,在您的情况下为 dm9601 Makefile。

例如:KBUILD_EXTRA_SYMBOLS := absolute_path_to_Module.symvers_of_mii

EXPORT_SYMBOL in kernel module | undefined symbol during insmod

  1. 列表项

Unknown symbol in while loading a kernel module

希望这能解决问题!

关于linux - 来自内核模块(dm9601 驱动程序)的 "Unknown symbol",这是否需要重建内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36873230/

相关文章:

linux - 当一个进程被杀死时,这些信息会记录在任何地方吗?

linux - 后台进程的重定向输出未显示在文件中

android - C & Android 内核模块 : what happened with f_flags here?

c - 打开文件 O_NONBLOCKING 在内核模块中丢失

linux - 如何知道哪个是当前内核模块?

linux - ps aux 不换行

linux - 行范围内的替换

c - 对 `printk' 的 undefined reference

android - 如何监视和记录哪个模块在 linux 内核中持有锁?

linux - net/socket.c 中带有 Printk 的 Tizen 内核镜像无法启动