c - __write_overflow 声明属性错误

标签 c linux-kernel

我在我的 Linux 内核项目中使用 memsetmemcpy。 当我尝试 make 项目时,出现以下错误:

In function ‘memset’, inlined from ‘init_minifw_read_write_module’ at /home/ido/CLionProjects/Firewall/KernelSpace/minfirewall.c:118:13: ./include/linux/string.h:327:3: error: call to ‘__write_overflow’ declared with attribute error: detected write beyond size of object passed as 1st parameter __write_overflow();

我没有找到上述错误的任何解决方法。

生成文件:

obj-m += minfirewall.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

我正在运行内核版本 4.18.0-15-generic。

有什么想法可以解决这个错误吗?

最佳答案

这是由于用于编译时和运行时保护的 _FORTIFY_SOURCE 功能,用于查找公共(public)字符串中的溢出(例如 strcpystrcmp >)和内存(例如 memcpymemcmp)函数。信息是herehere .

您可以通过将 -D_FORTIFY_SOURCE=0(-U_FORTIFY_SOURCE 也可以使用)传递给编译器来显式关闭此功能。

编辑:

看起来您正在构建一个 Linux 内核模块。为内核模块 Makefile 传递编译器选项有点specific .

将以下内容添加到您的 Makefile:

CFLAGS_minfirewall.o := -D_FORTIFY_SOURCE=0

关于c - __write_overflow 声明属性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55119644/

相关文章:

linux - swi SYS_ERROR0 在 arm linux 内核中做什么?

mysql - 连接CGI(C编程)与Mysql时出错

c - 如何从用户输入中提取偶数,并在C程序中将它们组合成一个新数字

c++ - 协助避免断言......总是!

linux - 为什么在 linux 中需要连续内存分配?

linux - syscall_table_32.S 未找到

linux - 如何从Linux内核空间获取用户名

代码不打印链表 C

C 预处理器定义替换字符串格式说明符

linux - 如何找到给定地址的 ptep?