web-dev-qa-db-fra.com

Compiler un module de noyau Linux 2.6 avec un compilateur plus récent

Je construis des machines intégrées qui exécutent une version RT_PREMPT de Linux. C'est une installation Ubuntu 10.04 exécutant un noyau Linux 2.6. Oui, c'est un vieux noyau, mais je suis coincé avec pendant un certain temps. 

Lorsque j'ai compilé le noyau, j'ai utilisé la version 4.4 de gcc. Sur ce système, il existe un module de noyau que je compile avec succès depuis trois ans. 

De mon Makefile ...

all:

make -C /lib/modules/$(Shell uname -r)/build M=$(PWD) \
    modules

Mon projet actuel nécessite la prise en charge de c ++ 14, j'ai donc mis à jour gcc et g ++ vers la version 5.1.0 en le construisant à partir du source. Tous mes logiciels en mode utilisateur compilent, mais quand je suis allé construire une version mise à jour de mon module de noyau, j'ai immédiatement l'erreur suivante:

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

En bref:

fatal error: linux/compiler-gcc5.h: No such file or directory

Si j'utilise encore gcc 4.4 (je l'ai laissé installé sur mon ordinateur dans un répertoire différent), il se compile et fonctionne parfaitement.

De toute évidence, il me manque quelque chose. N’est-il pas possible de compiler un module de noyau avec une version du compilateur plus récente que celle avec laquelle le système d’exploitation a été compilé? Cela me semble peu probable. Y a-t-il une étape de configuration qui me manque? Y a-t-il une variable système à mettre à jour? Y a-t-il des en-têtes supplémentaires que je suis censé télécharger? J'ai couru apte à mettre à jour build-essential, mais c'était à jour. J'ai la source et les en-têtes du noyau sur mon système. Je ne sais pas quoi d'autre je téléchargerais.

Toute compréhension de ce problème est grandement appréciée. Merci d'avance.

16
user761576

La version de votre noyau est trop ancienne et il manque linux/compiler-gcc5.h .

L'en-tête est inclus dans linux/compiler-gcc.h et son nom est généré par une macro de préprocesseur basée sur la version actuelle du compilateur:

#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)

Cet en-tête a été introduit autour de la version 3.18.

Vous pouvez essayer d'obtenir ce fichier à partir d'une source de noyau plus récente et de l'insérer dans include/linux.

16
baf

Ouvrez un terminal et tapez:

$ ls -r /usr/src/linux-headers-$(uname -r)/include/linux/ | \
  grep -P "compiler-gcc\d.h" | \
  head -n 1

j'espère que cela produira le dernier en-tête gcc adapté à votre noyau Linux.

Dans mon cas, c'est compiler-gcc4.h. Vous pouvez maintenant lier ce fichier à compiler-gcc5.h de la manière suivante:

$ 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
0
Filippo Lauria