用于Linux内核模块的外部功能不确定

发布于 2025-01-20 09:21:40 字数 3203 浏览 1 评论 0原文

我正在为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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

嘿哥们儿 2025-01-27 09:21:40

或者解决如下:将 shman build 目录下的 Module.symvers 复制到服务器 build 目录。

Alternatively resolved as below: copy Module.symvers under shman build directory to server build directory.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文