Mar*_*urg 4 linux compiling debian kernel-modules header-file
有一个文件version.h在/usr/include/linux。许多头文件都包含此文件并defines在其中使用ifdefs.
但是,当我编译自己的内核时,我看不到这如何在 eg 中正确反映 version.h。
实际上这适用于所有与内核相关的头文件。AFAICS/usr/include/linux始终代表我的发行版附带的内核,而不是正在运行的内核,也不是我make通过SYSSRC.
过去,我求助于创建指向我自己的内核源代码的符号链接,但我觉得这不是正确的方法。
这应该如何工作?如何针对自定义内核进行编译(例如内核模块)?
当针对您自己的自定义内核配置系统时,我建议在您修改后的内核源代码中为当前版本添加一个名称。
例如,在 Armbian 中,他们创建自己的内核包,并在 kernel.release 中添加 -sunxi。
以修改4.6.3内核版本为例:
root@ruir:/usr/src/linux-headers-4.6.3-sunxi# grep -ri 4.6.3-sunxi *
include/generated/utsrelease.h:#define UTS_RELEASE "4.6.3-sunxi"
include/config/kernel.release:4.6.3-sunxi
Run Code Online (Sandbox Code Playgroud)
而且,对于内核模块,在/lib/modules/4.6.3-sunxi/build:
include/generated/utsrelease.h:#define UTS_RELEASE "4.6.3-sunxi"
include/config/auto.conf.cmd:ifneq "$(KERNELVERSION)" "4.6.3-sunxi"
include/config/kernel.release:4.6.3-sunxi
Run Code Online (Sandbox Code Playgroud)
(请参阅在 ARM / Armbian Jessie 中安装 sysdig - 模块在错误的内核版本中编译)
正如我们所见,这可以在uname -r:
$uname -r
4.6.3-sunxi
Run Code Online (Sandbox Code Playgroud)
至于自定义内核包:
$dpkg -l | grep sunxi
ii linux-dtb-next-sunxi 5.16 armhf Linux DTB, version 4.6.3-sunxi
ii linux-firmware-image-next-sunxi 5.16 armhf Linux kernel firmware, version 4.6.3-sunxi
ii linux-headers-next-sunxi 5.16 armhf Linux kernel headers for 4.6.3-sunxi on armhf
ii linux-image-next-sunxi 5.16 armhf Linux kernel, version 4.6.3-sunxi
Run Code Online (Sandbox Code Playgroud)
至于在编译内核中添加自己的头文件,我将参考KernelHeaders(强调粗体是我的);如果您要更换次要内核版本,您可能(或可能不会)只使用make headers_install.
用户空间程序
通常,用户空间程序是针对发行版提供的头文件构建的,通常来自名为 glibc-devel、glibc-kernheaders 或 linux-libc-dev 的包。这些头文件通常来自较旧的内核版本,如果不重新构建 glibc,就无法安全地替换它们。特别是,强烈建议不要将 /usr/include/linux 安装为 /usr/src/linux/include 或 /lib/modules/*/build/include/linux 的符号链接,因为它经常破坏重建应用程序。例如,较旧的内核在 include/asm-${arch} 而不是 arch/${arch}/include/asm 中具有架构特定的头文件,并且具有指向架构特定目录的符号链接。
为发行版打包头文件的正确方法是从内核源目录运行“make headers_install”将头文件安装到 /usr/include 中,然后重建 C 库包,依赖于特定版本的刚刚安装的内核头文件。
如果您分发的用户空间程序依赖于某些内核头文件的特定版本,例如因为您的程序仅在打过补丁的或最新的内核上运行,则您不能依赖 /usr/include 中的头文件。您也不能使用来自 /usr/src/linux/include 或 /lib/modules/*/build/include/ 的头文件,因为它们尚未准备好包含在用户空间中。如果您尝试并指向这个 Wiki 页面,内核应该警告您这一点。解决此问题的正确方法是隔离您需要的特定接口,例如,在新内核中修补的单个头文件为您的程序使用的字符设备提供 ioctl 编号。在您自己的程序中,添加该源文件的副本,并注意它应与新内核版本保持同步。如果您的程序未根据 GPLv2 获得许可,请确保您已获得该文件作者的许可,可以根据您自己程序的许可分发它。由于您的程序现在依赖于常规内核中可能不存在的内核接口,因此最好添加运行时检查以确保内核理解该接口并在没有回退到较旧的内核时提供有用的错误消息界面。
也用于内核开发;或者为不同的服务器或安装了多个内核版本的不同内核编译内核/模块,SYSSRC 可用于指定备用内核源位置。
| 归档时间: |
|
| 查看次数: |
2331 次 |
| 最近记录: |