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

时间:2012-05-07 05:16:00

标签: linux-device-driver

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

2 个答案:

答案 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文件中。

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