centos7内核模块编译报错

发布于 2022-09-07 07:39:41 字数 1613 浏览 14 评论 0

问题背景
使用Makefile完成Linux内核模块程序的编译,出现了一下问题

代码结构

|-firewall
|------log.h
|------log.c
|------demo.c    // 引入log.h
|------Makefile

Makefile文件

ifneq ($(KERNELRELEASE),)
    obj-m += firewall.o
    firewall-objs := demo.o log.o

else      
    KDIR := /lib/modules/$(shell uname -r)/build
    PWD:= $(shell pwd)

    SUBDIRS := log

all:
    make -C $(KDIR) M=$(PWD) modules

clean:
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif  

报错

make -C /lib/modules/3.10.0-693.el7.x86_64/build M=/root/work/firewall/source modules
make[1]: 进入目录“/usr/src/kernels/3.10.0-693.el7.x86_64”
  CC [M]  /root/work/firewall/source/demo.o
In file included from /root/work/firewall/source/demo.c:7:0:
/root/work/firewall/source/log.h:4:19: 致命错误:stdio.h:没有那个文件或目录
 #include <stdio.h>
                   ^
编译中断。
make[2]: *** [/root/work/firewall/source/demo.o] 错误 1
make[1]: *** [_module_/root/work/firewall/source] 错误 2
make[1]: 离开目录“/usr/src/kernels/3.10.0-693.el7.x86_64”
make: *** [all] 错误 2

由上述可知,报错原因致命错误:stdio.h:没有那个文件或目录,但是系统是包含stdio.h文件的,位置在

find / -name "stdio.h"
/usr/include/bits/stdio.h
/usr/include/stdio.h

并且执行gcc -c test.c是成功的,文件内容如下

/*
*@file test.c 测试stdio.h存在于系统
*/
#include <stdio.h>
int main() {
}

问题
综上所述,根本原因不是缺少stdio.h文件,而是Makefile文件有问题,哪位大神能指点一下?(打字不易,非诚勿扰

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(1

仅此而已 2022-09-14 07:39:41

你不可以在内核模块中引用 stdio.h,因为它仅用于应用程序,它的实现依赖于

  1. GNU libc, https://www.gnu.org/software/...
  2. 或 musl libc, https://www.musl-libc.org/

等第三方库。

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