Связывание модуля ядра со статической библиотекой
Я пытаюсь связать мой модуль ядра с внешней статической библиотекой, например так:
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
Надеюсь, вы не пытаетесь связываться с общей библиотекой пространства пользователя... которая вообще не будет работать в пространстве ядра.