linux模块中使用其它模块导出的符号

步骤一:

在被依赖的模块B中导出要用的符号,如:

intcat9555_state_get_inp(void)

{

................

}

EXPORT_SYMBOL(cat9555_state_get_inp);

步骤二:

编译模块B,当前目录下生成Module.symvers文件,将其复制到模块A的目录下。

打开Module.symvers可以看到他的内容如下

0x3c1007e5cat9555_add_opt_addr/home/project/MeterRead/gpio/gpioEXPORT_SYMBOL
0x20473c2bcat9555_state_get_inp/home/project/MeterRead/gpio/gpioEXPORT_SYMBOL
0x3cc81287cat9555_del_opt_addr/home/project/MeterRead/gpio/gpioEXPORT_SYMBOL
0x68be5229cat9555_release_addr/home/project/MeterRead/gpio/gpioEXPORT_SYMBOL
0x743cae4dcat9555_state_as_gpo/home/project/MeterRead/gpio/gpioEXPORT_SYMBOL
0x9c89640ecat9555_state_as_gpi/home/project/MeterRead/gpio/gpioEXPORT_SYMBOL
0x977f0740cat9555_open_addr/home/project/MeterRead/gpio/gpioEXPORT_SYMBOL
0xf9713bbbcat9555_state_get_outp/home/project/MeterRead/gpio/gpioEXPORT_SYMBOL
0x28d7d46fcat9555_state_set_outp/home/project/MeterRead/gpio/gpioEXPORT_SYMBOL
原来这是记录导出符号的文件。

步骤三:

在模块A的文件中引用导出的符号。

externcat9555_state_get_inp(void); //声明引用的符号是外部变量。

int f(){

................

cat9555_state_get_inp(); //在这里引用导出的符号

................

}

编译A模块。

我如果没有步骤二的话,插入A模块时会出现以下错误(找不到符号 ):

gprsiodrv: no symbol version for cat9555_state_get_inp
gprsiodrv: Unknown symbol cat9555_state_get_inp
gprsiodrv: no symbol version for cat9555_state_as_gpi
gprsiodrv: Unknown symbol cat9555_state_as_gpi
insmod: cannot insert 'gprsiodrv.ko': unknown symbol in module

但是有人不用步骤二也可以,猜测与编译器有关。

你可能感兴趣的:(linux)