web-dev-qa-db-de.com

Kompilieren Sie ein Linux 2.6-Kernelmodul mit einem neueren Compiler

Ich baue eingebettete Maschinen, auf denen eine RT_PREMPT-Version von Linux ausgeführt wird. Es ist eine Ubuntu 10.04-Installation, auf der ein Linux 2.6-Kernel ausgeführt wird. Ja, es ist ein alter Kernel, aber ich bleibe eine Weile dabei. 

Als ich den Kernel kompilierte, habe ich die Version 4.4 von gcc verwendet. Auf diesem System gibt es ein Kernel-Modul, das ich seit drei Jahren erfolgreich kompiliere. 

Aus meinem Makefile ...

all:

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

Mein aktuelles Projekt erfordert Unterstützung für C++ 14, daher habe ich gcc und g ++ auf Version 5.1.0 aktualisiert, indem ich aus dem Quellcode erstellte. Alle meine User-Mode-Software wird kompiliert, aber wenn ich eine aktualisierte Version meines Kernel-Moduls erstellt habe, erhalte ich sofort die folgende Fehlermeldung:

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

Zusamenfassend:

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

Wenn ich gcc 4.4 erneut verwende (ich habe es auf meinem Computer in einem anderen Verzeichnis installiert), wird es kompiliert und läuft einwandfrei.

Offensichtlich fehlt mir etwas. Ist es nicht möglich, ein Kernel-Modul mit einer neueren Version des Compilers zu kompilieren, als mit dem Betriebssystem kompiliert wurde? Das scheint mir unwahrscheinlich. Gibt es einen Konfigurationsschritt, den ich vermisse? Gibt es eine Systemvariable, die ich aktualisieren muss? Gibt es zusätzliche Header, die ich herunterladen sollte? Ich habe ein Update von Build-Essential durchgeführt, aber es war auf dem neuesten Stand. Ich habe die Quelle und die Header für den Kernel in meinem System. Ich weiß nicht, was ich sonst noch herunterladen würde.

Alle Erkenntnisse zu diesem Problem werden sehr geschätzt. Danke im Voraus.

16
user761576

Ihre Kernel-Version ist zu alt und es fehlt linux/compiler-gcc5.h .

Der Header ist aus linux/compiler-gcc.h enthalten und sein Name wird vom Präprozessor-Makro basierend auf der aktuellen Compiler-Version generiert:

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

Dieser Header wurde in Version 3.18 eingeführt.

Sie könnten versuchen, diese Datei aus einer neueren Kernel-Quelle abzurufen und in include/linux einzufügen.

16
baf

Öffnen Sie ein Terminal und geben Sie Folgendes ein:

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

hoffentlich wird der neueste gcc-Header ausgegeben, der für Ihren Linux-Kernel geeignet ist.

In meinem Fall ist es compiler-gcc4.h. Jetzt können Sie diese Datei auf folgende Weise mit compiler-gcc5.h verknüpfen:

$ 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