2012-05-07 595 views
38

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

+1

我认为.ko是2.6内核对象文件,而.o是2.4。在这里阅读更多关于它的信息:http://tldp.org/HOWTO/Module-HOWTO/linuxversions.html – smichak

回答

34

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

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

在负责装载内核模块内核中的动态链接程序,希望能够找到数据结构中的核心放在KMOD对象在.ko文件,将无法加载内核模块,而不他们。

12

的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