gpt4 book ai didi

Linux 内核模块 - 在源文件之间共享变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:34 33 4
gpt4 key购买 nike

我正在尝试将内核模块链接到非 LKM 源文件。问题是,我遇到了一些问题。这两个文件的名称是 chardev.c(LKM)和 foo.c。

我的生成文件:

obj-m += chardev.o
obj-y += foo.o

all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
$(CC) test.c -o test
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
rm test

在 chardev.c 内部我有以下代码行:extern int foo;,在 foo 内部我有以下代码行:int foo = 123;。 (这两行都在文件范围内。)

当运行 make 时,我得到以下输出:

make -C /lib/modules/4.4.0-31-generic/build/ M=/home/kylemart/Desktop/Device-Driver modules
make[1]: Entering directory `/usr/src/linux-headers-4.4.0-31-generic'
CC [M] /home/kylemart/Desktop/Device-Driver/chardev.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: "foo" [/home/kylemart/Desktop/Device-Driver/chardev.ko] undefined!
CC /home/kylemart/Desktop/Device-Driver/chardev.mod.o
LD [M] /home/kylemart/Desktop/Device-Driver/chardev.ko
make[1]: Leaving directory `/usr/src/linux-headers-4.4.0-31-generic'
cc test.c -o test

似乎链接不正确。我做错了什么?

编辑:

这似乎可行,但有一个问题:

obj-m += chardev.o
chardev-objs += foo.o

all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
$(CC) test.c -o test
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
rm test

虽然它编译时没有警告,但在安装编译后的模块(即 sudo insmod chardev.ko)后,/dev 中没有新设备。以前,在不尝试链接源文件的情况下,如前所述安装内核模块会创建一个设备文件。也就是说,该设备在运行 lsmod 时存在。

最佳答案

您的 all 目标只构建模块,而不构建内核,因此那里不存在 foo 符号。

将源代码(此处:foo.c)编译到内核中时,您必须将 makefile 集成到内核源代码中。例如。你必须添加

obj-y += my-driver/

到上一个目录中的 makefile 并构建整个内核。您可能应该从 makefile 中删除 all:clean: 目标,以避免与内核内置规则发生冲突。

foo.c 必须包含

EXPORT_SYMBOL(foo);

EXPORT_SYMBOL_GPL(foo);

第二个makefile...

将只生成 chardev.ko 模块,该模块仅由 foo.c 构建; chardev.c 不会用于它。当你真的想要这个时,你必须更改文件名;例如

obj-m += chardev.o
chardev-objs = chardev-core.o foo.o

关于Linux 内核模块 - 在源文件之间共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49700578/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com