从树中构建内核驱动程序时,
我在drivers目录中运行make,其中KERNELDIR
是内核源代码的路径,或者是标题。
make -C $(KERNELDIR) M=$(PWD) modules
尝试使用以下方法构建标头时:
make headers_install ARCH=i386 INSTALL_HDR_PATH=$(HEADERSDIR)
我发现导出不适合构建模块(没有完整的内核源代码树)
似乎缺少多个文件和文件夹,如Makefile,脚本,include/generated/autoconf.h
或include/config/auto.conf
等。
Debian以一种可用的方式处理事务,如rules.real中所述,尽管它比Documentation/make/headers_install.txt
中描述的更多,这似乎不是“标准”方式。
简而言之:我如何正确导出linux头文件,以便我可以针对它构建外部模块?
答案 0 :(得分:5)
headers_install旨在从用户空间的角度导出一组适合使用的头文件。它是内核的用户空间公开API。假设您使用自定义数据结构创建了一个精彩的新ioctl。这是您不希望用户空间知道的信息,因此用户空间程序可以使用您精彩的新ioctl。
但是从用户空间看不到的内容,即内核的“私有”,或者内部API的内容,都不会暴露给用户空间。
因此,要构建一个out of tree模块,您需要一个完整配置的源树,或者由发行版打包的内核头。查找linux-headers或linux-kernel-headers 例如,在Ubuntu / Debian上打包。
答案 1 :(得分:2)
我相信内核make headers_install的文件目标是用于生成用于生成C库和工具链的Linux头文件,而不是为了能够构建完全配置的内核源代码的树内核模块。
事实上,我猜测在没有完整内核源代码的情况下构建树内核模块是不受支持的,实际上是由发行版创建的“hack”。