博客專欄

EEPW首頁(yè) > 博客 > 關(guān)于EXPORT_SYMBOL的作用淺析

關(guān)于EXPORT_SYMBOL的作用淺析

發(fā)布人:電子禪石 時(shí)間:2020-12-11 來(lái)源:工程師 發(fā)布文章

在查看內(nèi)核驅(qū)動(dòng)代碼的時(shí)候會(huì)經(jīng)??吹皆谝恍┖瘮?shù)后面總會(huì)跟EXPORT_SYMBOL()這樣的宏定義,通過(guò)網(wǎng)上查閱,它的作用大致總結(jié)如下:

1、定義說(shuō)明

     把內(nèi)核函數(shù)的符號(hào)導(dǎo)出,也可以理解成將函數(shù)名作為符號(hào)導(dǎo)出;符號(hào)的意思就是函數(shù)的入口地址,或者說(shuō)是把這些符號(hào)和對(duì)應(yīng)的地址保存起來(lái)的,在內(nèi)核運(yùn)行的過(guò)程中,可以找到這些符號(hào)對(duì)應(yīng)的地址的。

2、相關(guān)處理

     (1)、對(duì)編譯所得的.ko進(jìn)行strip -S,處理掉調(diào)試信息,這樣可以大大縮小ko文件的大?。?/p>

     (2)、使用KBUILD_EXTRA_SYMBOLS

主要使用于下面這樣的場(chǎng)合:

有兩個(gè)我們自己的模塊,其中Module B使用了Module A中的export的函數(shù),因此在Module B的Makefile文件中必須添加:

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

export KBUILD_EXTRA_SYMBOLS

這樣在編譯Module B時(shí),才不會(huì)出現(xiàn)Warning,提示說(shuō)func1這個(gè)符號(hào)找不到,而導(dǎo)致編譯得到的ko加載時(shí)也會(huì)出錯(cuò)。

// Module A (mod_a.c)
#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
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 B (mod_b.c)
#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);


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉