构建内核模块时如何链接静态库?

时间:2019-07-07 22:38:03

标签: linux linux-kernel kernel-module

我想从现有文件foo.ko和静态库foo.c构建Linux内核模块support.a。库support.a是从Rust编译的,因此没有support.c

我使用了以下Makefile

KERNEL_DIR := /lib/modules/$(shell uname -r)/build

obj-m += foo.o
foo-obs += support.a

all:
    $(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules V=1

似乎support.a未链接;有警告警告,从foo.c调用的功能(并在support.a中实现)未定义。

更新0 Makefile在Ubuntu LTS(我已经在18.04和14.04上进行了测试)上有效,但在Fedora(29/30上)上无效。对于Fedora,输出为:

...
make -C /lib/modules/5.1.11-200.fc29.x86_64/build SUBDIRS=/public/Github/rustyvisor modules
make[1] : on entre dans le répertoire « /usr/src/kernels/5.1.11-200.fc29.x86_64 »
Makefile:205: ================= WARNING ================
Makefile:206: 'SUBDIRS' will be removed after Linux 5.3
Makefile:207: Please use 'M=' or 'KBUILD_EXTMOD' instead
Makefile:208: ==========================================
  LD [M]  /public/Github/rustyvisor/rustyvisor.o
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: /public/Github/rustyvisor/rustyvisor.o(.init.text+0xbb): Section mismatch in reference from the function init_module() to the function .exit.text:rustyvisor_exit()
The function __init init_module() references
a function __exit rustyvisor_exit().
This is often seen when error handling in the init function
uses functionality in the exit path.
The fix is often to remove the __exit annotation of
rustyvisor_exit() so it may be used outside an exit section.

WARNING: "rustyvisor_core_unload" [/public/Github/rustyvisor/rustyvisor.ko] undefined!
WARNING: "rustyvisor_load" [/public/Github/rustyvisor/rustyvisor.ko] undefined!
WARNING: "rustyvisor_core_load" [/public/Github/rustyvisor/rustyvisor.ko] undefined!
WARNING: "rustyvisor_unload" [/public/Github/rustyvisor/rustyvisor.ko] undefined!
  LD [M]  /public/Github/rustyvisor/rustyvisor.ko
make[1] : on quitte le répertoire « /usr/src/kernels/5.1.11-200.fc29.x86_64 »

更新1:有一个非常相似的question,但是这个问题是要问为什么Makefile在Fedora上不起作用,但是我发现它在Ubuntu上可以工作。

1 个答案:

答案 0 :(得分:0)

最后,我找到了解决该问题的方法(但我仍然不明白为什么)。在Fedora上,库名support.a应该更改为support.o,然后链接程序才能工作!!!