4

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

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

出于某种原因,上面的 Makefile 根本不编译 my_prog.c,并且生成的模块不包含它的代码。当然,如果我删除my_prog-objs行,my_prog.c就会被编译。

Makefile 中的这种方法有什么问题?

4

3 回答 3

4

您必须创建一个合成名称以及源文件及其对象名称。您不能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并放置在同一目录中。因此,您需要获取外部库并将其作为已发布的版本在本地提供。您需要两个目标文件;一个是您编译的“C”代码/驱动程序,另一个是与库链接在一起的。


以上与 2.6.36 kbuild 基础结构有关。当前文档位于modules.rst 第 3.3 节 Binary Blobs中。我认为上述技术仍然适用于库,而不仅仅是对象。

于 2014-03-03T20:59:36.820 回答
3

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

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

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

于 2015-12-09T23:08:31.777 回答
1

您正在覆盖默认值my_prog-objs,即my_prog.o. 不要用库替换内容,而是将库添加到默认值:

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

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

于 2014-03-03T18:13:19.560 回答