首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux内核模块-源文件间共享变量

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

Stack Overflow用户
提问于 2018-04-06 20:29:19
回答 1查看 330关注 0票数 1

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

我的制作文件:

代码语言:javascript
复制
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时,我得到以下输出:

代码语言:javascript
复制
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

似乎事情联系不上了。我做错了什么?

编辑:

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

代码语言:javascript
复制
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时,设备是存在的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-06 21:50:05

您的all目标只构建模块,而不是内核,这样foo符号就不存在了。

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

代码语言:javascript
复制
obj-y += my-driver/

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

foo.c必须包含

代码语言:javascript
复制
EXPORT_SYMBOL(foo);

代码语言:javascript
复制
EXPORT_SYMBOL_GPL(foo);

第二个makefile。

将只生成chardev.ko模块,该模块仅由foo.c构建;chardev.c不会用于该模块。当你真的想这样做的时候,你必须改变文件名。

代码语言:javascript
复制
obj-m += chardev.o
chardev-objs = chardev-core.o foo.o
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49700578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档