zoukankan      html  css  js  c++  java
  • EXPORT_SYMBOL的使用

    转自:http://blog.csdn.net/cailiwei712/article/details/7998525

    在查看内核驱动代码的时候会经常看到在一些函数后面总会跟EXPORT_SYMBOL()这样的宏定义,通过网上查阅,它的作用大致总结如下:

    1、定义说明

         把内核函数的符号导出,也可以理解成将函数名作为符号导出;符号的意思就是函数的入口地址,或者说是把这些符号和对应的地址保存起来的,在内核运行的过程中,可以找到这些符号对应的地址的。

    2、相关处理

         (1)、对编译所得的.ko进行strip -S,处理掉调试信息,这样可以大大缩小ko文件的大小;

         (2)、使用KBUILD_EXTRA_SYMBOLS

    主要使用于下面这样的场合:

    有两个我们自己的模块,其中Module B使用了Module A中的export的函数,因此在Module B的Makefile文件中必须添加:

    KBUILD_EXTRA_SYMBOLS += /path/to/ModuleA/Module.symvers

    export KBUILD_EXTRA_SYMBOLS

    这样在编译Module B时,才不会出现Warning,提示说func1这个符号找不到,而导致编译得到的ko加载时也会出错。

    [cpp] view plain copy
     
    1. // Module A (mod_a.c)  
    2. #include<linux/init.h>  
    3. #include<linux/module.h>  
    4. #include<linux/kernel.h>  
    5.   
    6. static int func1(void)  
    7. {  
    8.        printk("In Func: %s... ",__func__);  
    9.        return 0;  
    10. }  
    11.   
    12. // Export symbol func1  
    13. EXPORT_SYMBOL(func1);  
    14.   
    15. static int __init hello_init(void)  
    16. {  
    17.        printk("Module 1,Init! ");  
    18.        return 0;  
    19. }  
    20.   
    21. static void __exit hello_exit(void)  
    22. {  
    23.        printk("Module 1,Exit! ");  
    24. }  
    25.   
    26. module_init(hello_init);  
    27. module_exit(hello_exit);  
    [cpp] view plain copy
     
    1. // Module B (mod_b.c)  
    2. #include<linux/init.h>  
    3. #include<linux/kernel.h>  
    4. #include<linux/module.h>  
    5.   
    6. static int func2(void)  
    7. {  
    8.        extern int func1(void);  
    9.        func1();  
    10.        printk("In Func: %s... ",__func__);  
    11.        return 0;  
    12. }  
    13.   
    14. static int __init hello_init(void)  
    15. {  
    16.        printk("Module 2,Init! ");  
    17.        func2();  
    18.        return 0;  
    19. }  
    20.   
    21. static void __exit hello_exit(void)  
    22. {  
    23.        printk("Module 2,Exit! ");  
    24. }  
    25.   
    26. module_init(hello_init);  
    27. module_exit(hello_exit);  
     
  • 相关阅读:
    SpringCloud学习总结(九)——微服务架构高并发问题
    SpringCloud学习总结(八)——服务调用Feign
    SpringCloud学习总结(七)——服务注册中心Consul
    SpringCloud学习总结(六)——服务调用和负载均衡Ribbon
    Hadoop综合大作业
    分布式文件系统HDFS练习
    安装Hadoop
    爬虫综合大作业(震惊!爬取了590位微信好友后竟然发现了)
    爬取全部的校园新闻
    理解爬虫原理
  • 原文地址:https://www.cnblogs.com/dirt2/p/6223801.html
Copyright © 2011-2022 走看看