欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

EXPORT_SYMBOL解析

系統 2278 0

一般我們編寫C程序時,要調用某個文件中的函數,需要在本文件中包含聲明有被調用函數的頭文件,然后編譯連接后,方能找到調用函數。對于模塊依賴的情況,不能簡單的使用上面的方法,內核提供了一個機制,就是EXPORT_SYMBOL 標簽內定義的函數或者符號對全部內核代碼公開,不用修改內核代碼就可以在您的內核模塊中直接調用,即使用 EXPORT_SYMBOL可以將一個函數以符號的方式導出給其他模塊使用 您還可以手工修改內核源代碼來導出另外的函數,用于重新編譯并加載新內核后的測試。

?

    include/module.h:

 

struct kernel_symbol 

{

    unsigned long value;   

    const char *name;

};

/* For every exported symbol, place a struct in the __ksymtab section */

#define __EXPORT_SYMBOL(sym, sec)               \

    __CRC_SYMBOL(sym, sec)                  \

    static const char __kstrtab_##sym[]         \

    __attribute__((section("__ksymtab_strings")))       \

    = MODULE_SYMBOL_PREFIX #sym;                        \

    static const struct kernel_symbol __ksymtab_##sym   \

    __attribute_used__                  \

    __attribute__((section("__ksymtab" sec), unused))   \

    = { (unsigned long)&sym, __kstrtab_##sym }



#define EXPORT_SYMBOL(sym)                  \

    __EXPORT_SYMBOL(sym, "")



#define EXPORT_SYMBOL_GPL(sym)                  \

    __EXPORT_SYMBOL(sym, "_gpl")



#endif
  

?

下面是這種方法是演示:

EXPORT_SYMBOL解析

第一個模塊文件如下:

[lingyun@localhost export_symbol]$ ls
mod1 ?mod2
[lingyun@localhost export_symbol]$ cd mod1/
[lingyun@localhost mod1]$ ls
Makefile ?mod_a.c
[lingyun@localhost mod1]$ vim mod_a.c?
?mod_a.c ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    /*********************************************************************************

 *      Copyright:  (C) 2013 fulinux<fulinux@sina.com> 

 *                  All rights reserved.

 *

 *       Filename:  mod_a.c

 *    Description:  This file 

 *                 

 *        Version:  1.0.0(07/12/2013~)

 *         Author:  fulinux <fulinux@sina.com>

 *      ChangeLog:  1, Release initial version on "07/12/2013 10:06:50 AM"

 *                 

 ********************************************************************************/





#include <linux/init.h>

#include <linux/module.h>

#include <linux/kernel.h>





static int func1(void)

{

    printk("In Func: %s...\n",__func__);

    return 0;

}

EXPORT_SYMBOL(func1);





static int __init hello_init(void)

{

    printk("Module 1, Init!\n");

    return 0;

}





static void __exit hello_exit(void)

{

    printk("Module 1, Exit!\n");

}





module_init(hello_init);

module_exit(hello_exit);





MODULE_LICENSE("GPL");
  


其中EXPORT_SYMBOL(func1)導出func1函數符號,保存函數地址和名稱.

?

這個模塊的第一個Makefile文件:

[lingyun@localhost mod1]$ ls
Makefile ?mod_a.c
[lingyun@localhost mod1]$ vim Makefile?

?

    obj-m:=mod1.o

mod1-y:=mod_a.o



KERNELDIR := /lib/modules/$(shell uname -r)/build



PWD:=$(shell pwd)



modules:

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules



modules_install:

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:

    rm -rf *.o *~core .depend .*.cmd *.ko *.ko.* *.mod.c .tmp_versions *odule* $(TARGET)


  


其中 內嵌對象 - obj-y,可加載模塊 - obj-m, KERNELDIR指向 指向內核代碼目錄。

?

編譯編譯并加載:

[lingyun@localhost mod1]$ ls
Makefile ?mod_a.c
[lingyun@localhost mod1]$ make
make -C /lib/modules/2.6.32-279.el6.x86_64/build ?M=/usr/local/src/lingyun/fulinux/export_symbol/mod1 modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-279.el6.x86_64'
? CC [M] ?/usr/local/src/lingyun/fulinux/export_symbol/mod1/mod_a.o
? LD [M] ?/usr/local/src/lingyun/fulinux/export_symbol/mod1/mod1.o
? Building modules, stage 2.
? MODPOST 1 modules
? CC ? ? ?/usr/local/src/lingyun/fulinux/export_symbol/mod1/mod1.mod.o
? LD [M] ?/usr/local/src/lingyun/fulinux/export_symbol/mod1/mod1.ko.unsigned
? NO SIGN [M] /usr/local/src/lingyun/fulinux/export_symbol/mod1/mod1.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-279.el6.x86_64'

[lingyun@localhost mod1]$ sudo insmod mod1.ko

[lingyun@localhost mod1]$ cat /proc/kallsyms | grep func1
0000000000000000 r __ ksymtab_func1 ? ? ?[mod1]
0000000000000000 r __ kstrtab_func1 ? ? ?[mod1]
0000000000000000 r __ kcrctab_func1 ? ? ?[mod1]
0000000000000000 T func1 ? ? ? ?[mod1]
[lingyun@localhost mod1]$?

[lingyun@localhost mod1]$ dmesg | grep Module
- User ID: CentOS (Kernel Module GPG key)
Module 1, Init!


第二個模塊的文件如下:

[lingyun@localhost mod1]$ cd ../mod2/
[lingyun@localhost mod2]$ vim mod_b.c?

?

    /*********************************************************************************

 *      Copyright:  (C) 2013 fulinux<fulinux@sina.com> 

 *                  All rights reserved.

 *

 *       Filename:  mod_b.c

 *    Description:  This file 

 *                 

 *        Version:  1.0.0(07/12/2013~)

 *         Author:  fulinux <fulinux@sina.com>

 *      ChangeLog:  1, Release initial version on "07/12/2013 10:29:55 AM"

 *                 

 ********************************************************************************/



#include <linux/init.h>

#include <linux/kernel.h>

#include <linux/module.h>



static int func2(void)

{

    extern int func1(void);

    func1();

    printk("In Func: %s...\n",__func__);

    return 0;

}



static int __init hello_init(void)

{

    printk("Module 2, Init!\n");

    func2();

    return 0;

}



static void __exit hello_exit(void)

{

    printk("Module 2, Exit!\n");

}



module_init(hello_init);

module_exit(hello_exit);



MODULE_LICENSE("GPL");
  

?

?

在這里調用了第一個模塊中的func1函數。

對應的Makefile文件:

[lingyun@localhost mod2]$ vim Makefile?

?

    obj-m:=mod2.o

mod2-y:=mod_b.o



KERNELDIR := /lib/modules/$(shell uname -r)/build



PWD:=$(shell pwd)



modules:

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules



modules_install:

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:

    rm -rf *.o *~core .depend .*.cmd *.ko *.ko.* *.mod.c .tmp_versions *odule* $(TARGET)


  


[lingyun@localhost mod2]$ make
make -C /lib/modules/2.6.32-279.el6.x86_64/build ?M=/usr/local/src/lingyun/fulinux/export_symbol/mod2 modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-279.el6.x86_64'
? Building modules, stage 2.
? MODPOST 1 modules
WARNING: "func1" [/usr/local/src/lingyun/fulinux/export_symbol/mod2/mod2.ko] undefined!
make[1]: Leaving directory `/usr/src/kernels/2.6.32-279.el6.x86_64'
[lingyun@localhost mod2]$?

?

[lingyun@localhost mod2]$ sudo insmod mod2.ko
insmod: error inserting 'mod2.ko': -1 Unknown symbol in module
[lingyun@localhost mod2]$?

解決上面的問題如下:

解決辦法是把mod_a的Module.symvers放到mod_b的當前路徑,從而編譯mod_b,符號信息會自動連接進去.
或者在mod_b的makefile中使用KBUILD_EXTRA_SYMBOLS指定mod_a的Module.symvers, 如:
KBUILD_EXTRA_SYMBOLS=/mod_a/Module.symvers

編譯mod_b時,搜索Module.symvers的路徑是:
1, kernel source path, e.g. /usr/src/kernels/linux-2.6.28.10
2, makefile中M=所指定的路徑, 它等效于變量KBUILD_EXTMOD的值
3, 變量KBUILD_EXTRA_SYMBOLS的值

此時Makefile文件如下:

?

    obj-m:=mod2.o

mod2-y:=mod_b.o




    
      KBUILD_EXTRA_SYMBOLS=~/fulinux/export_symbol/mod1/Module.symvers
    
    

KERNELDIR := /lib/modules/$(shell uname -r)/build



PWD:=$(shell pwd)



modules:

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules



modules_install:

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:

    rm -rf *.o *~core .depend .*.cmd *.ko *.ko.* *.mod.c .tmp_versions *odule* $(TARGET)


  


在編譯加載如下:

?

[lingyun@localhost mod2]$ make
make -C /lib/modules/2.6.32-279.el6.x86_64/build ?M=/usr/local/src/lingyun/fulinux/export_symbol/mod2 modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-279.el6.x86_64'
? CC [M] ?/usr/local/src/lingyun/fulinux/export_symbol/mod2/mod_b.o
? LD [M] ?/usr/local/src/lingyun/fulinux/export_symbol/mod2/mod2.o
? Building modules, stage 2.
? MODPOST 1 modules
? CC ? ? ?/usr/local/src/lingyun/fulinux/export_symbol/mod2/mod2.mod.o
? LD [M] ?/usr/local/src/lingyun/fulinux/export_symbol/mod2/mod2.ko.unsigned
? NO SIGN [M] /usr/local/src/lingyun/fulinux/export_symbol/mod2/mod2.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-279.el6.x86_64'
[lingyun@localhost mod2]$ sudo insmod mod2.ko
[lingyun@localhost mod2]$?

[lingyun@localhost mod2]$ dmesg | grep "In Func:"
In Func: func1...
In Func: func2...

可見模塊二調用模塊一的func1成功!!!








?? ? ?


?

EXPORT_SYMBOL解析


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品国产午夜福利在线观看 | 一区二区三区日韩在线观看 | 国产精品久久久久免费 | 久久久久国产一区二区三区 | 蜜桃av一区二区三区 | 亚洲精品久久久中文字幕 | 午夜成人免费视频 | 91在线免费看 | 欧美日韩一区,二区,三区,久久精品 | 亚洲免费在线视频 | 国产成人+综合亚洲+天堂 | 日韩精品亚洲一级在线观看 | 国产精品福利在线观看免费不卡 | 欧美视频网站在线观看 | 中文字幕日韩欧美一区二区三区 | 欧美午夜精品一区二区蜜桃 | 蜜桃av一区二区三区 | 大开眼界 无删减 | 欧美在线精品一区二区在线观看 | 特黄免费 | 草草视频免费在线观看 | 亚洲国产精品人人爽夜夜爽 | 欧美精品综合一区二区三区 | www.4hu影院| 福利片在线看 | 日本在线观看中文字幕 | 中文字幕三区 | 免费一级毛片 | 成年网站在线播放 | 亚洲国产精品99久久久久久久久 | 日日撸视频| 欧美精品第三页 | 免费人成年短视频在线观看免费网站 | 嫩草影院在线入口 | 国产一区二区自拍 | 污视频免费看网站 | 婷婷免费视频 | 三级做爰大爽视频 | 91不卡在线 | 久久久久国产成人精品亚洲午夜 | 午夜a狂野欧美一区二区 |