• Uncategorized

About linux : extern-functions-undefined-for-linux-kernel-modules

Question Detail

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

Question Answer

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

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.