Компиляция внешнего модуля ядра с большим количеством исходных файлов

#compilation #linux-kernel

#Сборник #linux-ядро

Вопрос:

Я новичок в ядре Linux.

При компиляции модуля ядра я сталкиваюсь со следующей проблемой:

 make[3]: execvp: /bin/sh: Argument list too long
  

Отслеживая проблему, я вижу, что проблема заключается в связывании (ld) модуля.
Мой модуль состоит из большого количества файлов, в то время как исходные коды модуля находятся по пути длиной 60 символов. Я вижу, что ld использует абсолютный путь к объектным файлам.

Я не слишком знаком с моей системой сборки, но, насколько я вижу, мы добавляем в obj-m * .c файлы с относительным путем.

Есть идеи?

Комментарии:

1. Не уверен, о чем это, но если проблема в том, что путь слишком длинный, одно из решений — создать символическую ссылку и использовать ее вместо этого.

2. Можно ли изменить сборку, чтобы создать статические библиотеки меньшего размера, а затем связать их вместе, чтобы сформировать модуль?

3. @Joachim Pileborg возможно ли это с kbuild?

4. Символическая ссылка @Pithikos тоже не помогает — я вижу, что ld по-прежнему использует абсолютные пути.

Ответ №1:

Довольно странно, что ваш модуль ядра такой большой и состоит из такого количества файлов. Общепринятая мудрость заключается в том, чтобы иметь небольшие модули ядра (возможно, взаимодействующие с внешними вспомогательными программами пользовательского пространства). Вы уверены в своей архитектуре программного обеспечения?

Возвращаясь к вопросу, вы можете поместить все аргументы gcc в файл like my.args и просто вызвать gcc с gcc @my.args gcc @ помощью специального дескриптора because .

Вы также можете перекомпилировать свое ядро и соответствующим образом увеличить файл #define for ARG_MAX in include/linux/limits.h . Я часто определяю его как 2 мега (байт), т.е. (2<<20)

Комментарии:

1. gcc @my.args поддерживается файлами kbuild?

2. Это особенность gcc сама по себе, а не системы сборки.

3. Хорошая функция, но мне нужно решение для kbuild. Я боюсь, что увеличение ARG_MAX не вариант.