是否可以编译包含非内核包含定义的功能的 linux 内核 (2.6) 模块?
例如:
内核模块.h
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h> // printk()
// ...
#include <openssl/sha.h>
// ...
生成文件
obj-m := kernelmodule.o
all:
$(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules
clean:
$(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean
$(RM) Module.markers modules.order
我编写并正在尝试编译的内核模块包含许多 openssl 包含文件中的功能。
上面给出的标准 makefile 不允许包含 linux 头文件之外的内容。是否可以包含此功能?如果可以,请您指出正确的方向。
谢谢, 迈克
最佳答案
内核不能使用用户空间代码并且必须独立(即完全独立,没有库),因此它不会选择标准头文件。
目前尚不清楚尝试获取用户空间 header 有什么好处。如果其中有一些东西可以有效使用(常量,一些宏,如果它们不调用任何用户空间函数),那么最好复制它们并仅包含您需要的内核兼容部分。
无法将内核与专为用户空间使用而设计的库链接 - 即使它们不进行任何操作系统调用 - 因为内核中的链接环境无法获取它们。
相反,重新编译要在内核中使用的任何函数(假设它们不进行任何操作系统或库调用 - 例如 malloc - 在这种情况下它们无论如何都需要修改)。将它们合并到您自己的库中,以便在您的内核模块中使用。
Linux 的最新版本无论如何都包含加密函数,包括各种 SHA 哈希 - 也许您可以使用其中之一。
另一个想法是停止尝试在内核空间中进行加密并将代码移至用户空间。用户空间代码更易于编写/调试/维护等。
关于linux - 编译包含非内核头文件的 linux 内核 (2.6) 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/817487/