新 prctl 选项的宏定义在用户 space 代码中不起作用
New prctl option's macro definition isn't working in user space code
我在 Linux 内核 v5.6 中为 prctl(2)
系统调用添加了一个新选项。使用我的更改编译内核后,当我用数字调用 prctl
(即 prctl(59, arg1, arg2, arg3, arg4)
)时,我能够触发新选项对用户 space 进程的影响。但是,当我为 include/uapi/linux/prctl.h
中的选项创建一个宏定义为 #define PR_NEW_OPTION 59
时,在编译我的用户 space 代码时出现以下错误:
error: ‘PR_NEW_OPTION’ undeclared (first use in this function); did you mean ‘PR_SET_SECCOMP’?
prctl(PR_NEW_OPTION, arg1, arg2, arg3, arg4);
^~~~~~~~~~~~~~~
PR_SET_SECCOMP
请注意,我在我的用户 space C 文件中包含 sys/prctl.h
。
我的内核代码能够正常访问 PR_NEW_OPTION
,并且内核编译没有错误。我需要做些什么来编译用户 API?我错过了什么?
我在 x86_64 机器上 运行 东西。
您是否 re-sync GCC 在构建 user-space 代码时实际使用的来自内核源代码的 headers?通常那些来自 glibc 包,例如在 Arch 上 GNU/Linux /usr/include/sys/prctl.h
来自 core/glibc
,这就是当您 #include <sys/prctl.h>
在普通程序中使用的内容,而不是内核源代码的一部分。
即glibc 维护自己的内核同步副本 headers 以供正常构建使用。(对于构建新内核模块,大多数发行版也会打包内核 headers,例如 pacman -Ql linux-headers
显示它在 /usr/lib/modules/5.7.6-arch1-1/build/include/...
中提供了文件。但是同样,那些只会在构建内核模块时使用,而不是用于 #include <sys/prctl.h>
的普通程序,即使你已经从你的 kernel-headers 构建了一个包修改内核源代码。)
要使用内核版本,您可能需要在您的 gcc 命令行上使用 -I /path/to/linux/include
将其指向您的工作内核树中的 include 目录你更新后的 sys/prctl.h
.
(或者也许有一些更标准的方法可以做到这一点,另一个答案会指出,这避免了用 Linux 源代码树版本覆盖其他标准 headers 。就像也许只使用完整的#include "/path/to/..."
)
中的路径
我在 Linux 内核 v5.6 中为 prctl(2)
系统调用添加了一个新选项。使用我的更改编译内核后,当我用数字调用 prctl
(即 prctl(59, arg1, arg2, arg3, arg4)
)时,我能够触发新选项对用户 space 进程的影响。但是,当我为 include/uapi/linux/prctl.h
中的选项创建一个宏定义为 #define PR_NEW_OPTION 59
时,在编译我的用户 space 代码时出现以下错误:
error: ‘PR_NEW_OPTION’ undeclared (first use in this function); did you mean ‘PR_SET_SECCOMP’?
prctl(PR_NEW_OPTION, arg1, arg2, arg3, arg4);
^~~~~~~~~~~~~~~
PR_SET_SECCOMP
请注意,我在我的用户 space C 文件中包含 sys/prctl.h
。
我的内核代码能够正常访问 PR_NEW_OPTION
,并且内核编译没有错误。我需要做些什么来编译用户 API?我错过了什么?
我在 x86_64 机器上 运行 东西。
您是否 re-sync GCC 在构建 user-space 代码时实际使用的来自内核源代码的 headers?通常那些来自 glibc 包,例如在 Arch 上 GNU/Linux /usr/include/sys/prctl.h
来自 core/glibc
,这就是当您 #include <sys/prctl.h>
在普通程序中使用的内容,而不是内核源代码的一部分。
即glibc 维护自己的内核同步副本 headers 以供正常构建使用。(对于构建新内核模块,大多数发行版也会打包内核 headers,例如 pacman -Ql linux-headers
显示它在 /usr/lib/modules/5.7.6-arch1-1/build/include/...
中提供了文件。但是同样,那些只会在构建内核模块时使用,而不是用于 #include <sys/prctl.h>
的普通程序,即使你已经从你的 kernel-headers 构建了一个包修改内核源代码。)
要使用内核版本,您可能需要在您的 gcc 命令行上使用 -I /path/to/linux/include
将其指向您的工作内核树中的 include 目录你更新后的 sys/prctl.h
.
(或者也许有一些更标准的方法可以做到这一点,另一个答案会指出,这避免了用 Linux 源代码树版本覆盖其他标准 headers 。就像也许只使用完整的#include "/path/to/..."
)