“Paramètres non valides” erreur lorsque vous essayez d'insérer un module qui accède à des symboles exportés

J'essaie de partager une variable globale entre les deux modules, afin de comprendre comment utiliser le EXPORT_SYMBOL macro correctement, mais je reçois un Invalid paramaters d'erreur lorsque j'essaie d'insérer le deuxième module.

Dans le premier module foo.c:

#include <linux/module.h>
#include <linux/kernel.h>

extern unsigned myvar;
unsigned myvar = 42;
EXPORT_SYMBOL(myvar);

static int __init foo_init(void){
        printk(KERN_INFO "HELLO FROM MODULE 1");

        return 0;
}

static void __exit foo_exit(void){
        printk(KERN_INFO "BYE FROM MODULE 1");
}

module_init(foo_init);
module_exit(foo_exit);

MODULE_LICENSE("GPL");

Dans le deuxième module bar.c:

#include <linux/module.h>
#include <linux/kernel.h>

extern unsigned myvar;

static int __init bar_init(void){
        printk(KERN_INFO "HELLO FROM MODULE 2");

        printk(KERN_INFO "myvar: %u", myvar);

        return 0;
}

static void __exit bar_exit(void){
        printk(KERN_INFO "BYE FROM MODULE 2");
}

module_init(bar_init);
module_exit(bar_exit);

MODULE_LICENSE("GPL");

Je compile chaque module dans des répertoires distincts séparés des Makefiles. Puis-je insérer chaque module manuellement:

# insmod foo.ko
# insmod bar.ko

Error: could not insert module bar.ko: Invalid parameters   

Si je tente d'insérer bar.ko tout d'abord, je devrait recevoir le symbole inconnu erreur:

# insmod bar.ko
Error: could not insert module bar.ko: Unknown symbol in module

Voici le symbole de vidage:

# nm foo.ko | grep myvar

00000000ec933bae A __crc_myvar
0000000000001118 r __kcrctab_myvar
000000000000057c r __kstrtab_myvar
0000000000000b20 r __ksymtab_myvar
0000000000000180 D myvar

Je suis à court d'un Debian système (noyau v3.2.21) avec un Xenomai patch appliqué:

# uname -r
3.2.21-xenomai-2.6.2.1-ipipe

Malheureusement, je ne pense pas que CONFIG_KALLSYMS_ALL est activé, donc je ne peux pas regarder dans /proc/kallsyms/ pour vérifier que myvar est effectivement exportés.

avez-vous un en-tête commun qui permet de définir le symbole de partager?
J'ai extern unsigned myvar; dans les deux fichiers (j'ai pu le coller dans un fichier d'en-tête, mais l'effet net doit être le même).
avoir vos modules module_init() et module_exit() ? Quelque part dans votre code, il existe un EINVAL erreur retournée?
Si je commente les variables, le module de charge très bien sans aucune erreur; l'erreur se produit uniquement lorsque les variables sont sans commentaire. Je code un rapide bare-bones version de chaque module et de modifier ma réponse à montrer ce que je veux dire.
Découvrez ma mise à jour de question.

OriginalL'auteur Vilhelm Gray | 2013-05-03