Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 将内核模块与静态库链接_Linux Kernel_Kbuild - Fatal编程技术网

Linux kernel 将内核模块与静态库链接

Linux kernel 将内核模块与静态库链接,linux-kernel,kbuild,Linux Kernel,Kbuild,我正在尝试将内核模块与外部静态库链接,如下所示: 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中使用这种方法有什么问题?您正在覆盖默认的my\u prog-objs,它只是my\u prog.o。将

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

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中使用这种方法有什么问题?

您正在覆盖默认的
my\u prog-objs
,它只是
my\u prog.o
。将库添加到默认值,而不是用库替换内容:

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

希望您没有试图链接到一个通用的用户空间库。。。这在kernelspace中根本不起作用。

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



上述内容与2.6.36 kbuild基础设施相关。当前文档位于中。我认为上述技术仍然适用于库,而不仅仅是对象。

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

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

我花了大约2个小时才弄明白为什么我的模块什么都没做

然后它抱怨对
my_prog.o
的循环依赖并跳过它。显然,您只需要
lib.o\u中所需的对象。您可以通过使用
ar
提取所有对象,然后使用
ld-r
进行增量链接,从
lib.a
中创建它。至少我想我是这么做的。。。如果有人有更好的方法,我在听:)