BBS水木清华站∶精华区
发信人: niche (Hi), 信区: Linux
标 题: Re: linux module 驱动程序一问.
发信站: BBS 水木清华站 (Thu Nov 18 15:46:30 1999)
【 在 musician (big mountain) 的大作中提到: 】
∶ 我想一个CHAR驱动程序,刚编一个框架就遇到问题:
∶ 用gcc -DMODULE -D__KERNEL__ -c card.c编译后
∶ insmod card.o 报错:
∶ card.o: unresolved symbol printk
∶ 不知是何缘故?
∶ 编译内核时,已经选了module的选项,网卡也是module.
∶ 请高手快快帮忙!
这个问题是这样的,为了避免把不同版本的module加载到内核中的时候带来麻烦,
Linux为每个函数(实际上是所谓的symbol)增加了一个版本标记。printk可能会变成
printk_R1b7d4074之类的东西。每个内核编出来的东西也不一样。因此,假如你的程序
想调用printk就会失败,你应该调用一个叫作printk_R1b7d4074的函数。
这是通过gensyms来完成的,放在/usr/src/linux/include/linux/modules目录下
(也可能是modules-up或modules-smp),在ksyms.ver文件中,有如下定义:
#define __ver_printk 1b7d4074
#define printk _set_ver(printk)
在modsetver.h(/usr/src/linux/include/linux)中,有(我可能没有按顺序写)
#define __VERSIONED_SYMBOL2(x,v) x ## _R ## v
#define __VERSIONED_SYMBOL1(x,v) __VERSIONED_SYMBOL2(x,v)
#define __VERSIONED_SYMBOL(x) __VERSIONED_SYMBOL1(x,__SYMBOL_VERSION(x))
#define _set_ver(x) __VERSIONED_SYMBOL(x)
#define __SYMBOL_VERSION(x) __ver_ ## x
好了,现在你应该知道printk是怎样变成printk_R1b7d4074的了。
只要保证你用来启动的内核与/usr/src/linux/下的源码是一致的(前者是用后者编译的)
否则,只要再编译一遍就行了。
如果只是那些*.ver文件有问题,可以
rm -f /usr/src/linux/include/linux/modules/*
然后,make dep即可
以上只是我的个人经验,如果不管用,千万不要骂我 8-)
--
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.112.96.80]
BBS水木清华站∶精华区