【问题标题】:How to link kernel functions to user-space program?如何将内核函数链接到用户空间程序?
【发布时间】:2026-02-21 12:50:01
【问题描述】:

我有一个用户空间程序 (Capstone)。我想在 FreeBSD 内核中使用它。我相信它们中的大多数具有相同的函数名、语义和参数(在 FreeBSD 中,内核 printf 也被命名为 printf)。首先,我将它构建为libcapstone.a 库,并将我的程序与它链接起来。由于 Linux 用户空间和 FreeBSD 内核之间的包含文件不同,因此库找不到像 sprintfmemsetvsnprintf 这样的符号。我怎样才能使这些符号(来自 FreeBSD 内核)对libcapstone.a 可见?

如果在Linux用户空间源代码中直接包含<sys/systm.h>之类的头文件,即使我将-D_BSD_SOURCE添加到CFLAGS,错误也会类似于undefined type u_int or u_char

此外,还有其他更好的方法吗?

【问题讨论】:

  • 首先你说你想在用户空间程序中使用内核函数。然后你会谈论在内核模块中使用用户空间函数听起来像什么。是哪个?
  • 将用户空间程序作为库放入内核。很抱歉造成混乱。

标签: linux linker kernel freebsd static-linking


【解决方案1】:

你还需要 ;查看内核手册页,例如“man 9 printf”。他们在顶部列出了所需的包含。

但是,请注意,您正在尝试做一些真正困难的事情。可能有一些基本功能(例如 printf);其他完全不同(例如 malloc(9)),并且大多数 POSIX API 根本不存在。您将无法使用 open(2)、socket(2) 或 fork(2)。

【讨论】: