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

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

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

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

负责加载内核模块的内核中的dynamic链接器期望find内核放在.ko文件中的kmod对象中的数据结构,并且不能在没有它们的情况下加载内核模块。

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

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