58

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

4

2 回答 2

60

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

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

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

于 2012-05-07T05:31:04.800 回答
18

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

来自http://tldp.org/HOWTO/Module-HOWTO/linuxversions.html

于 2012-05-07T16:59:44.013 回答