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