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水木清华站∶精华区