2016-06-22 12 views
1

Szenario 1: Ich versuche, mit einem Vanille-Kernel 3.10 (eigentlich kernel-lt von Elrepo) IBMGPFS Treiber auf RHEL6 zu installieren. Der Teil GPL nicht kompiliert durch:Proper Funktion prüft, ob Kernel-Modul Quellcode

  • Zu viele/zu wenig Argumente übergeben
  • struct x kein solches Mitglied fein auf
  • Typenkonflikt

Ihr Code kompiliert hat funktionieren Lager RHEL/Suse Kernel älter oder neuer als meins, aber hier versagt.

Szenario 2: Ich versuche, den Open-Source-Treiber softiwarp auf RHEL6 mit Standard-Kernel zu kompilieren, aber es funktioniert nicht mit dem gleichen Fehler wie in Szenario 1. Es ist jedoch auf einem Vanilla-Kernel kompiliert fein.

Das alles ist, weil ihre Feature-Check-Header wie folgt aussehen:

#if LINUX_KERNEL_VERSION >= 2061300 
#define FOO <newer variant> 
#else 
#define FOO <older variant> 
#endif 

Aber RHEL und Suse haben viele updates und Fehlerbehebungen, so dass ihre 3.10.1013.10.101 nicht das gleiche wie Vanille ist.

Wie schreibe ich Code, der überprüft Funktionen, nicht Versionsnummer? In einem User-Space-Programm würde ich autoconf Makros AC_CHECK_MEMBER/AC_CHECK_FUNC

Antwort

0

Wie schreibt man Code verwenden, die Funktionen überprüfen wird, nicht Versionsnummer? In einem User-Space-Programm würde ich autoconf Makros AC_CHECK_MEMBER/AC_CHECK_FUNC

Die Standard-Präprozessor Fähigkeiten sind viel weniger nutzen als manche Leute scheinen zu denken. Es hat keine Fähigkeit, direkt das zu tun, was Sie wollen. Autoconf bietet auch in dieser Hinsicht keine Magie; es führt einfach Tests zur Konfigurationszeit durch, oft einfach durch Prüfen, ob der Compiler ein gegebenes Stück Code akzeptiert, und es übermittelt die Ergebnisse weitgehend an den Compiler, indem Präprozessor-Makros definiert werden. (Und Sie sind verantwortlich für die Verwendung dieser Makros in bedingten Tests wie in Ihrem Beispiel benötigt).

Da wir über Autoconf sprechen jedoch, solange es gegen die Kernel-Header, die die entsprechen Kernel, für den Sie bauen, sollten zumindest einige Autoconf-Makros für Sie arbeiten, und Sie sollten in der Lage sein, benutzerdefinierte Autoconf-Tests für andere zu schreiben. Jedes Problem, das der Compiler zum Zeitpunkt der Erstellung erkennen kann, sollte Autoconf ebenfalls testen können.

Natürlich gibt es auch die Möglichkeit, dem Modul-Generator die Möglichkeit zu geben, benötigte Konfigurationsdetails explizit anzugeben, wenn ein heikles Problem wie dieses auftaucht. Passen Sie beispielsweise die Makros zur Merkmalsauswahl an, um auch auf ein Symbol zu achten, das für den Builder reserviert ist, um die Ergebnisse zu modulieren.

+0

Was ?! Autotools sind stark unter libc angewiesen. Wie können Sie sie mit Kernel verwenden, ohne sich selbst zu hacken? – 0andriy

+0

@AndyShevchenko, könnten Sie auch sagen, '' gcc' und 'make' verlassen sich auf libc, also wie können Sie sie verwenden, um Kernel zu bauen?"Tatsache ist, dass die Autoconf-Prüfungen, die für Ihr Problem relevant sind, sich auf den Test über den Compiler verlassen, also müssen Sie, wie gesagt, nur sicherstellen, dass die Kernel-Header die richtigen sind. Autoconf weiß, wie viele Überprüfungen durchgeführt werden Sinnvoll für einen Kernel-Build (zB Bibliotheks-Checks), aber das heißt nicht, dass Sie die sinnvollen Checks nicht verwenden können. –

+0

Obwohl ich Ihre Vermutung meiner Ignoranz im 1. Absatz @JohnBollinger nicht mag, ist die Der Rest Ihrer Antwort ergibt Sinn, ich werde es akzeptieren – basin