Versucht man ein Kernel-Modul zu laden, dessen Symbole nicht durch den Kernel-Modul-Loader aufgelöst werden können, schlägt das Laden fehl. Sind diese Symbole jedoch für den Betrieb des Moduls nicht zwingend nötig und man könnte z.B. im Debug-Fall darauf verzichten, muss man im Allgemeinen das Modul ohne die Modul-Abhängigkeiten neu übersetzen. Um sich diesen Schritt zu sparen, kann man auch Weak-Symbols verwenden – diese sind NULL, wenn sie der Kernel nicht zur Verfügung stellt:

#include <linux/module.h>
#include <linux/init.h>
extern int not_always_defined __attribute__((weak));

static int mod_init(void)
{
  if (&not_always_defined) {
      printk(KERN_ERR "provided!\n");
  } else {
      printk(KERN_ERR "NOT defined\n");  
  }
  return 0;
}

static void mod_exit(void)
{
}

module_init(mod_init);
module_exit(mod_exit);

Ein anderer Ansatz, der für GPL-kompatible Module in Frage kommt, ist das Suchen eines Symbols über die vom Kernel bereitgestellte find_symbol-Funktion:

struct kernel_symbol *sym;
void (*fn)(void);
sym = find_symbol("FUNCTION_NAME", NULL, NULL, 0, 0);
if (sym != NULL) {
	fn = (void *)sym->value;
	printk(KERN_ERR "Calling function found: %pF\n", fn);
	fn();
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Name *

achtzehn + 2 =