Компилировать модуль ядра 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