来自内核模块(dm9601驱动程序)的“未知符号”,是否需要重建内核?

时间:2016-04-26 18:41:34

标签: 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

1 个答案:

答案 0 :(得分:0)

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

代表:cat /proc/kallsyms | grep mii_link_ok

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

如果存在符号,请尝试下面之一,

  1. 包括** KBUILD_EXTRA_SYMBOLS =<"内核模块的Module.symvers的绝对路径,该模块导出函数或变量">在内核模块的Makefile中将使用导出的函数或变量,在你的情况下为dm9601 Makefile。
  2. 例如:KBUILD_EXTRA_SYMBOLS:= absolute_path_to_Module.symvers_of_mii

    EXPORT_SYMBOL in kernel module | undefined symbol during insmod

    1. 列表项
    2. Unknown symbol in while loading a kernel module

      希望这会解决问题!。