我正在编写简单的Linux模块mod.c. 当我编译mod.c文件时,它会创建两个输出文件 mod.o 和 mod.ko 。 所以我只是想知道, mod.o和mod.ko文件有什么区别?
答案 0 :(得分:43)
简短的回答是 .ko 文件是您的目标文件,它与内核所需的一些内核自动生成的数据结构相链接。
.o 文件是模块的目标文件 - 编译C文件的结果。然后内核构建系统自动创建另一个C文件,其中包含一些描述内核模块的数据结构(名为your_module_kmod.c),将此C文件编译为另一个目标文件,并链接目标文件和它一起构建的目标文件以创建 .ko 档案。
负责加载内核模块的内核中的动态链接器期望找到内核放在 .ko 文件中的kmod对象中的数据结构,并且无法加载没有它们的内核模块。
答案 1 :(得分:14)
在Linux 2.6之前,用户空间程序将解释ELF对象 (.o)文件并完成将其链接到正在运行的内核的所有工作, 生成完成的二进制图像。该程序将传递该图像 内核和内核只会坚持下去 记忆。在Linux 2.6中,内核进行链接。用户空间 程序直接将ELF目标文件的内容传递给 核心。为此,ELF对象图像必须包含其他内容 信息。为了识别这种特殊类型的ELF目标文件,我们 将文件命名为后缀“.ko”(“内核对象”)而不是“.o”For 例如,Linux 2.4中的串行设备驱动程序存在于该文件中 Linux 2.6中的serial.o位于serial.ko文件中。