#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 не вариант.