用于Linux内核模块的外部功能不确定
我正在为Linux开发几个内核模块,下面是我的模块结构:
inc\
shman.h
shman\
extern.c
extern.h
module.c
module.h
...
server\
module.c
module.h
我在Extern.H中声明了Extern功能,该功能将由服务器模块使用,通过Export_Symbol在Extern.C中定义和导出它们:
===extern.h===
long shman_open(char *name, int flags, int mode);
long shman_write(long fd, void *data, long size, long offset);
long shman_read(long fd, void *data, long size, long offset);
long block_write(long fd, void *data, long size, long offset);
void *block_read(long fd, long offset, long *len);
void *block_first(void *cursor);
void *block_next(void *blk);
void *block_data(void *blk);
typedef int (*Compare)(void *src, void *dst);
void *block_search(long fd, Compare cmpfunc, void *dst);
===extern.c===
/*
* Function definition, ignored...
*/
/*
* Export functions
*/
EXPORT_SYMBOL(shman_open);
EXPORT_SYMBOL(shman_write);
EXPORT_SYMBOL(shman_read);
EXPORT_SYMBOL(block_write);
EXPORT_SYMBOL(block_read);
EXPORT_SYMBOL(block_first);
EXPORT_SYMBOL(block_next);
EXPORT_SYMBOL(block_data);
EXPORT_SYMBOL(block_search);
EXPORT_SYMBOL(cursor_free);
我还声明了Shman中的Extern功能。 h如下,服务器模块将包含:
extern long shman_open(char *name, int flags, int mode);
extern long shman_write(long fd, void *data, long size, long offset);
extern long shman_read(long fd, void *data, long size, long offset);
extern long block_write(long fd, void *data, long size, long offset);
extern void *block_read(long fd, long offset, long *len);
extern void *block_first(void *cursor);
extern void *block_next(void *blk);
extern void *block_data(void *blk);
typedef int (*Compare)(void *src, void *dst);
extern void *block_search(long fd, Compare cmpfunc, void *dst);
extern void cursor_free(void *data);
我将“ shman.h”包括在服务器\ module.c中,并在内核模块服务器中使用这些外部功能。
它在WSL(Ubuntu 20.04,内核版本为4.19.128-Microsoft-nasterard)中工作正常,但是当我按照正常的Ubuntu发行版进行编译(20.04,内核版本为5.4.100代)时,我就会遵循编译错误:
ERROR: "block_search" [/root/l4a/build/kernel/server/l4aserver.ko] undefined!
ERROR: "shman_open" [/root/l4a/build/kernel/server/l4aserver.ko] undefined!
ERROR: "block_first" [/root/l4a/build/kernel/server/l4aserver.ko] undefined!
ERROR: "block_data" [/root/l4a/build/kernel/server/l4aserver.ko] undefined!
ERROR: "cursor_free" [/root/l4a/build/kernel/server/l4aserver.ko] undefined!
make[4]: *** [scripts/Makefile.modpost:94: __modpost] Error 1
make[3]: *** [Makefile:1675: modules] Error 2
make[2]: *** [kernel/server/CMakeFiles/l4aserver.dir/build.make:65: kernel/server/l4aserver.ko] Error 2
make[1]: *** [CMakeFiles/Makefile2:348: kernel/server/CMakeFiles/l4aserver.dir/all] Error 2
make: *** [Makefile:95: all] Error 2
Kbuild for for Kbuild for for Kbuild for Shman模块:
obj-m := shman.o
shman-objs := extern.o factory.o handler.o module.o test.o file.o nl_handler.o nl_net.o
EXTRA_CFLAGS=-I/root/l4a/src/kernel/common/../inc -I/root/l4a/src/kernel/netlink -I/root/l4a/src/kernel/shman
服务器模块的Kbuild:
obj-m := l4aserver.o
l4aserver-objs := server.o server.o file.o crypto.o hash.o machine.o
EXTRA_CFLAGS=-I/root/l4a/src/kernel/common/../inc
I am developing several kernel modules for linux, below are my module structure:
inc\
shman.h
shman\
extern.c
extern.h
module.c
module.h
...
server\
module.c
module.h
I declared extern functions in extern.h that will be used by server module, define and export them in extern.c through EXPORT_SYMBOL:
===extern.h===
long shman_open(char *name, int flags, int mode);
long shman_write(long fd, void *data, long size, long offset);
long shman_read(long fd, void *data, long size, long offset);
long block_write(long fd, void *data, long size, long offset);
void *block_read(long fd, long offset, long *len);
void *block_first(void *cursor);
void *block_next(void *blk);
void *block_data(void *blk);
typedef int (*Compare)(void *src, void *dst);
void *block_search(long fd, Compare cmpfunc, void *dst);
===extern.c===
/*
* Function definition, ignored...
*/
/*
* Export functions
*/
EXPORT_SYMBOL(shman_open);
EXPORT_SYMBOL(shman_write);
EXPORT_SYMBOL(shman_read);
EXPORT_SYMBOL(block_write);
EXPORT_SYMBOL(block_read);
EXPORT_SYMBOL(block_first);
EXPORT_SYMBOL(block_next);
EXPORT_SYMBOL(block_data);
EXPORT_SYMBOL(block_search);
EXPORT_SYMBOL(cursor_free);
I also declared extern function in shman.h as below, which will be included by server module:
extern long shman_open(char *name, int flags, int mode);
extern long shman_write(long fd, void *data, long size, long offset);
extern long shman_read(long fd, void *data, long size, long offset);
extern long block_write(long fd, void *data, long size, long offset);
extern void *block_read(long fd, long offset, long *len);
extern void *block_first(void *cursor);
extern void *block_next(void *blk);
extern void *block_data(void *blk);
typedef int (*Compare)(void *src, void *dst);
extern void *block_search(long fd, Compare cmpfunc, void *dst);
extern void cursor_free(void *data);
I include "shman.h" in server\module.c, and use those extern functions in kernel module server.
It works fine in WSL(Ubuntu 20.04, kernel version is 4.19.128-microsoft-standard), but when I compile on normal Ubuntu distribution(20.04, kernel version is 5.4.100-generic), I got following compile error:
ERROR: "block_search" [/root/l4a/build/kernel/server/l4aserver.ko] undefined!
ERROR: "shman_open" [/root/l4a/build/kernel/server/l4aserver.ko] undefined!
ERROR: "block_first" [/root/l4a/build/kernel/server/l4aserver.ko] undefined!
ERROR: "block_data" [/root/l4a/build/kernel/server/l4aserver.ko] undefined!
ERROR: "cursor_free" [/root/l4a/build/kernel/server/l4aserver.ko] undefined!
make[4]: *** [scripts/Makefile.modpost:94: __modpost] Error 1
make[3]: *** [Makefile:1675: modules] Error 2
make[2]: *** [kernel/server/CMakeFiles/l4aserver.dir/build.make:65: kernel/server/l4aserver.ko] Error 2
make[1]: *** [CMakeFiles/Makefile2:348: kernel/server/CMakeFiles/l4aserver.dir/all] Error 2
make: *** [Makefile:95: all] Error 2
Kbuild for shman module:
obj-m := shman.o
shman-objs := extern.o factory.o handler.o module.o test.o file.o nl_handler.o nl_net.o
EXTRA_CFLAGS=-I/root/l4a/src/kernel/common/../inc -I/root/l4a/src/kernel/netlink -I/root/l4a/src/kernel/shman
Kbuild for server module:
obj-m := l4aserver.o
l4aserver-objs := server.o server.o file.o crypto.o hash.o machine.o
EXTRA_CFLAGS=-I/root/l4a/src/kernel/common/../inc
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
或者解决如下:将 shman build 目录下的 Module.symvers 复制到服务器 build 目录。
Alternatively resolved as below: copy Module.symvers under shman build directory to server build directory.