Связывание модуля ядра со статической библиотекой

Я пытаюсь связать мой модуль ядра с внешней статической библиотекой, например так:

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?

3 ответа

Вы должны создать синтетическое имя, а также исходный файл и его имя объекта. Вы не можете использовать 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 и помещены в тот же каталог. См. Пункт 11 под примечанием TODO. Итак, вам нужно взять внешнюю библиотеку и предоставить ее локально в виде поставляемой версии. Вам нужны два объектных файла; один - это ваш скомпилированный код / ​​драйвер "C", а другой - связанный с библиотекой.

Примечание: я шучу; он имеет TODO для документирования этой функции.

Когда вы создаете my_prog-objs list, вы говорите kbuild использовать только объектные файлы в этом списке. kbuild больше не будет компилироваться my_prog.cи в том числе my_prog.o в my_prog-objs приводит к круговой зависимости. Вместо этого вам нужно создать уникальный obj-m и включать оба my_prog.o а также /path/lib.a в его objs список. Например:

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

У меня ушло около 2 часов, чтобы понять, почему мой модуль ничего не делал!

Вы переопределяете значение по умолчанию my_prog-objsчто просто my_prog.o, Вместо замены содержимого библиотекой добавьте библиотеку по умолчанию:

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

Надеюсь, вы не пытаетесь связываться с общей библиотекой пространства пользователя... которая вообще не будет работать в пространстве ядра.

Другие вопросы по тегам