Как связать статическую библиотеку при сборке модуля ядра? - PullRequest
0 голосов
/ 08 июля 2019

Я хочу собрать модуль ядра Linux foo.ko из существующего файла foo.c и статической библиотеки 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: Существует очень похожий вопрос , но этот вопрос состоит в том, чтобы спросить, почему Makefile не работает на Fedora, но я обнаружил, что он работает на Ubuntu.

1 Ответ

0 голосов
/ 09 июля 2019

Наконец, я нашел обходной путь для проблемы (но я все еще не понимаю, почему). На Fedora имя библиотеки support.a должно быть изменено на support.o, тогда компоновщик работает !!!

...