Компилировать модуль ядра linux 2.6 с более новым компилятором
Я создаю встроенные машины, которые запускают RT_PREMPT версию Linux. Это установка Ubuntu 10.04 с ядром Linux 2.6. Да, это старое ядро, но я застрял с ним некоторое время.
Когда я скомпилировал ядро, я использовал gcc версии 4.4. В этой системе есть модуль ядра, который я успешно компилировал в течение трех лет.
Из моего Makefile...
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) \
modules
Мой текущий проект требует поддержки С++ 14, поэтому я обновил gcc и g++ до версии 5.1.0, построив исходный код. Все мои программы пользовательского режима компилируются, но когда я пошел на сборку обновленной версии моего модуля ядра, я сразу же получил следующую ошибку:
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-54-generic'
CC [M] /home/tbj/srcroot/ctsengine-hg/CtsRt/ctsrt_main.o
In file included from include/linux/compiler.h:40:0,
from include/linux/stddef.h:4,
from include/linux/list.h:4,
from include/linux/module.h:9,
from /home/tbj/srcroot/ctsengine-hg/CtsRt/ctsrt_main.c:31:
include/linux/compiler-gcc.h:86:30: fatal error: linux/compiler-gcc5.h: No such file or directory
Короче:
fatal error: linux/compiler-gcc5.h: No such file or directory
Если я снова использую gcc 4.4 (я оставил его на своем компьютере в другом каталоге), он компилируется и работает отлично.
Очевидно, что я что-то упускаю. Невозможно ли скомпилировать модуль ядра с более новой версией компилятора, чем скомпилирована операционная система? Мне это кажется маловероятным. Есть ли какой-то шаг конфигурации, который мне не хватает? Есть ли системная переменная, которую мне нужно обновить? Есть ли дополнительные заголовки, которые я должен скачать? Я приложил все усилия для обновления сборки, но это было актуально. У меня есть источник и заголовки ядра для моей системы. Я не уверен, что еще загрузить.
Любые идеи этой проблемы очень ценятся. Заранее благодарю вас.
Ответы
Ответ 1
Ваша версия ядра слишком старая и отсутствует linux/compiler-gcc5.h
.
Заголовок включен из linux/compiler-gcc.h, и его имя генерируется макросом препроцессора на основе текущей версии компилятора:
#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
Этот заголовок был представлен вокруг версии 3.18
.
Вы можете попытаться получить этот файл из более нового исходного кода ядра и вставить его в include/linux
.
Ответ 2
Откройте терминал и введите:
$ ls -r /usr/src/linux-headers-$(uname -r)/include/linux/ | \
grep -P "compiler-gcc\d.h" | \
head -n 1
мы надеемся, вывести последний заголовок gcc, подходящий для вашего ядра Linux.
В моем случае это compiler-gcc4.h
. Теперь вы можете связать этот файл с compiler-gcc5.h
следующим образом:
$ sudo ln -s /usr/src/linux-headers-$(uname -r)/include/linux/compiler-gcc4.h \
/usr/src/linux-headers-$(uname -r)/include/linux/compiler-gcc5.h