2014-03-03 86 views
3

我想我的内核模块与外部静态库链接,像这样:链接内核模块的静态库

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中出现了什么问题?

回答

1

您正在覆盖默认的my_prog-objs,这只是my_prog.o。相反,与库替换的内容,将库添加到默认:

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

希望你不是想对一个普通的用户态库......不会在内核空间在所有的工作联系起来。

+0

然后它抱怨'my_prog.o'的循环依赖并且无论如何跳过它。 –

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 TODOnote。因此,您需要将外部库作为的本地版本提供给本地版本。你需要两个目标文件;一个是你编译的'C'代码/驱动程序,另一个是与库连接在一起。

说明:我很face;;它有一个TODO来记录这个功能。

+0

显然,你只需要在'lib.o_shipped'中需要的对象。你可以从'lib.a'中创建它,方法是用'ar'提取所有对象,然后用'ld -r'做一个增量链接。至少这就是我认为我所做的......如果有人有更好的方法,我在听:) –

2

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

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

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