.o 和 .ko 文件之间的区别



我正在编写简单的Linux模块mod.c。当我编译mod.c文件时,它会创建两个输出文件mod.o和mod.ko所以我只想知道,mod.o 和 mod.ko 文件有什么区别?

简短的回答是,.ko文件是你的目标文件,与内核所需的一些自动生成的数据结构链接。

.o文件是模块的目标文件 - 编译C文件的结果。然后,内核构建系统会自动创建另一个 C 文件,其中包含一些描述内核模块的数据结构(名为 your_module_kmod.c(,将此 C 文件编译为另一个目标文件,并将您的目标文件和它构建的对象文件链接在一起以创建 .ko 文件。

内核

中负责加载内核模块的动态链接器期望在 .ko 文件中找到内核放入 kmod 对象中的数据结构,如果没有它们,将无法加载内核模块。

在 Linux 2.6 之前,用户空间程序会解释 ELF 对象 (.o( 文件并完成将其链接到正在运行的内核的所有工作, 生成完成的二进制映像。程序将传递该图像 到内核,内核只会把它粘进去 记忆。在 Linux 2.6 中,内核执行链接。用户空间 程序将 ELF 对象文件的内容直接传递给 内核。为此,ELF 对象图像必须包含其他 信息。为了识别这种特殊类型的 ELF 对象文件,我们 使用后缀".ko"("内核对象"(而不是".o"命名文件。 例如,Linux 2.4 中的串行设备驱动程序存在于文件中 Linux 2.6 中的 serial.o 位于文件 serial.ko 中。

从 http://tldp.org/HOWTO/Module-HOWTO/linuxversions.html.

.

ko是模块文件的扩展名,.o是目标文件的扩展名。

对象文件是通过编译扩展名为 .c.h 的源文件创建的。

通过链接相关对象文件和必要的依赖项来创建模块文件。

模块

文件是一个可加载的内核模块 (LKM(,可以在不重新启动计算机的情况下动态加载和卸载到正在运行的内核。目标文件用作创建模块文件的构建基块。

以下是 scsi_mod 模块的生成文件中的一行:

drivers/scsi/Makefile:scsi_mod-y += scsi.o hosts.o scsi_ioctl.o

上面的行取自位于驱动程序/scsi 位置下的生成文件。

scsi_mod是通过链接以下目标文件创建的模块文件:scsi.o、hosts.o 和 scsi_ioctl.o

最新更新