欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

导出符号

程序员文章站 2022-06-05 17:28:49
...

导出符号

  • 解决的是模块之间的相互函数调用问题,使用导出符号可以在其他模块中使用该模块的变量或函数,可以形成模块依赖
a.c
    int add(int a, int b){return a+b;}
    EXPORT_SYMBOL(add);或者  
    EXPORT_SYMBOL_GPL(add); 
a.h 
    extern int add(int, int);
b.c
    #include "a.h"
    add(10,20)
  • 编写程序
import.c:

#include <linux/init.h>
#include <linux/module.h>
#include "export.h"

static int __init import_init(void) {
    int res = 0;
    res = add(100,200);
    printk("res=%d\n",res);
    return 0;
}

static void __exit import_exit(void) {
    int res = add(5,8);
    printk("res=%d\n",res);
}

module_init(import_init);
modele_init(import_exit);

MODULE_LICENSE("GPL");
-------------------------------------
export.c:

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("GPL");

int add(int a, int b) {
    printk("enter %s %s %d\n", __FILE__, __func__, __LINE__);
    return a+b;
}

EXPORT_SYMBOL(add); //导出符号

--------------------------------------
export.h

#ifndef __EXPORT_H__
#define __EXPORT_H__

extern int add(int, int);//用之前需要先声明一下

#endif
  • 安装程序
    • 先安装export后安装import
    • 查看信息
  • 卸载程序
    • 先卸载import后卸载export
  • EXPORT_SYMBOL(add)和EXPORT_SYMBOL_GPL(add)区别;
    • linux2.6的“/prob/kallsyms”文件对应着内核符号表,记录了符号以及符号所在的内存地址,模块可以使用如下宏导出符号到内核符号表
    • 导出的符号可以被其他模块使用,不过使用之前一定要声明一下。
    • EXPORT_SYMBOL_GPL()只适用于包含GPL许可权的模块。
相关标签: 驱动