如何理解 Linux 内核模块的“构建单独的文件”?

Posted

技术标签:

【中文标题】如何理解 Linux 内核模块的“构建单独的文件”?【英文标题】:How to understand "Building Separate Files" for a Linux kernel module? 【发布时间】:2014-08-01 05:26:39 【问题描述】:

摘自Linux内核documentation:

2.4 构建单独的文件

It is possible to build single files that are part of a module.
This works equally well for the kernel, a module, and even for
external modules.

Example (The module foo.ko, consist of bar.o and baz.o):
    make -C $KDIR M=$PWD bar.lst
    make -C $KDIR M=$PWD baz.o
    make -C $KDIR M=$PWD foo.ko
    make -C $KDIR M=$PWD /

我不明白这些命令是什么意思。

make -C $KDIR M=$PWD bar.lst

是不是意思:找bar.c,编译成bar.1st?

make -C $KDIR M=$PWD foo.ko

这是否意味着:查找所有 *.o 并将它们链接到 foo.ko?它是否也寻找 *.1st?

make -C $KDIR M=$PWD /

什么意思?

【问题讨论】:

【参考方案1】:

首先让我们了解

make -C $KDIR M=$PWD [target]

这里的目标可以是任何定义为目标的东西(即 bar.o : )

我们大多在 make 文件中使用依赖。

在给定的例子中三个文件

foo.c 酒吧.c baz.c

foo.c 有 module_init 即入口点

声明声明我们可以一次构建所有文件。 或单个文件,最后将它们链接在一起。

简而言之,您可以尝试只编译 bar.c 而不编译其他两个文件。只生产 bar.o

一旦生成了所有 .o 文件,您就可以创建 .ko 文件了。

参考linux/fs/ufs/Makefile

你可以编译一次 ufs.ko 或 balloc.o cylinder.o dir.o file.o ialloc.o inode.o 等。 并编译 ufs 以创建 ufs.ko

【讨论】:

【参考方案2】:

这些命令都意味着“做任何makefile所说的构建命名目标所必需的事情”。这样做所涉及的一系列操作我不能说,这将完全取决于具体目标是什么。

如果你想知道,具体来说,make 会对给定命令做什么,给它-n 参数。

【讨论】:

OP 正在询问构建树内核模块的一个非常具体的特性。这个答案没有解决这个问题

以上是关于如何理解 Linux 内核模块的“构建单独的文件”?的主要内容,如果未能解决你的问题,请参考以下文章

LSM相关知识及理解

Linux内核模块编程可以使用的内核组件

实验二 内核模块编译

如何编译一个linux下的驱动模块

linux 实践2.2 编译模块

内核模块的加载如何在 linux 中工作?