模組a中使用export_symbol或export_symbol_gpl將要提供給b模組的函式匯出;
模組b中用extern 宣告需要用到的a模組提供的函式。
**如下:
模組a的** – a_func.c
#include #include #include #include // print jiffies
void a_print_jiffies(void)
export_symbol(a_print_jiffies);
static int __init a_init(void)
static void __exit a_exit(void)
module_init(a_init);
module_exit(a_exit);
module_author("xu*******@macrosan");
module_description("module a");
module_version("0.1");
module_license("gpl");
模組b的** – b_func.c
#include #include #include #include extern void a_print_jiffies(void);
static int __init b_init(void)
static void __exit b_exit(void)
module_init(b_init);
module_exit(b_exit);
module_author("xu*******@macrosan");
module_description("module b!");
module_version("0.1");
module_license("gpl");
模組a的makefile
obj-m := a_func.o
kerneldir := /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
default:
$(make) -c $(kerneldir) m=$(pwd) modules
clean:
rm -f *.o *.ko *.mod.c *.order *.symvers
模組b的makefile
obj-m := b_func.o
kerneldir := /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
default:
$(make) -c $(kerneldir) m=$(pwd) modules
clean:
rm -f *.o *.ko *.mod.c *.order *.symvers
接下來,有3種方式使得模組b編譯及載入不出現warning或failed.
方法一:
a模組在make之後,會產生乙個module.symvers檔案,將該檔案拷貝到b模組源檔案目錄中,然後執行make
方法二:
修改b模組的makefile檔案:
新增kbuild_extra_symbols += /path_to_module_a/module.symvers
export kbuild_extra_symbols
obj-m := xhz2_func.o
kerneldir := /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
kbuild_extra_symbols += /home/xhz/project/temp_module/module.symvers
export kbuild_extra_symbols
default:
$(make) -c $(kerneldir) m=$(pwd) modules
clean:
rm -f *.o *.ko *.mod.c *.order *.symvers
方法三:
修改linux核心原始碼樹中的module.symers檔案,將a模組編譯產生的module.symvers的內容新增在此檔案中。(注意將空格替換為tab,否則編譯b時會報錯)。
個人推薦使用第二種方法,相比方法一省去拷貝檔案的步驟。相比方法三,無須修改linux核心原始碼樹中的module.symvers.
參考1.2.《深入linux裝置驅動程式核心機制》–陳學松 page45
Linux核心模組間函式呼叫正確方法
模組a中使用export symbol或export symbol gpl將要提供給b模組的函式匯出 模組b中用extern 宣告需要用到的a模組提供的函式。如下 模組a的 a func.c include include include include print jiffies void a p...
Linux核心模組間函式呼叫正確方法
模組a中使用export symbol或export symbol gpl將要提供給b模組的函式匯出 模組b中用extern 宣告需要用到的a模組提供的函式。如下 模組a的 a func.c include include include include print jiffies void a p...
Linux核心模組間函式呼叫正確方法
模組a中使用export symbol或export symbol gpl將要提供給b模組的函式匯出 模組b中用extern 宣告需要用到的a模組提供的函式。如下 模組a的 a func.c include include include include print jiffies void a p...