将内核模块与静态lib链接

时间:2014-03-03 15:34:21

标签: linux-kernel kbuild

我正在尝试将我的内核模块与外部静态库链接,如下所示:

obj-m += my_prog.o
my_prog-objs := some/path/lib.a
# all the standard targets...

对于某些reasone,上面的Makefile根本不编译my_prog.c,结果模块不包含其代码。当然,如果我删除my_prog-objs行,my_prog.c会被编译。

在Makefile中使用这种方法有什么问题?

3 个答案:

答案 0 :(得分:2)

创建my_prog-objs列表时,告诉kbuild只使用该列表中的目标文件。 kbuild将不再编译my_prog.c,并且在my_prog.o中包含my_prog-objs会导致循环依赖。相反,您需要创建一个唯一的obj-m,并在其my_prog.o列表中包含/path/lib.aobjs。例如:

obj-m += foo.o
foo-objs += my_prog.o /path/lib.a

我花了大约2个小时来弄清楚为什么我的模块什么也没做!

答案 1 :(得分:1)

您将覆盖默认my_prog-objs,这只是my_prog.o。不是用库替换内容,而是将库添加到默认值:

my_prog-objs := my_prog.o some/path/lib.a

希望您不要尝试链接到一般用户空间库......在内核空间中根本不起作用。

答案 2 :(得分:1)

您必须创建合成名称以及源文件及其对象名称。您无法直接使用my_prog.o,因为有来自源的规则。这是一个样本,

 obj-m += full.o
 full-src := my_prog.c
 full-objs := $(full-src:.c=.o) lib.o # yes, make it an object.

只能从某些特殊目录支持库。您的对象应命名为lib.o_shipped并放在同一目录中。请参阅:item 11 under TODO note 。因此,您需要使用外部库并将其作为随附的版本在本地提供。你需要两个目标文件;一个是你编译的'C'代码/驱动程序,另一个是它与库链接在一起。

注意:我很滑稽;它有一个TODO来记录这个功能。