00000011.htm

来自「一份很好的linux入门资料」· HTM 代码 · 共 86 行

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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?