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 (¬_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(); }