Journal Help C++ et modules Linux 2.6

Posté par  .
Étiquettes : aucune
0
15
mar.
2004
J'essaie de compiler le driver Bewan PCI ST sous Linux 2.6.
J'y suis presque.
Mais voilà ce qui ce passe lors du depmod :
WARNING: unicorn_pci_atm.ko needs unknown symbol __eqdf2
WARNING: unicorn_pci_atm.ko needs unknown symbol __gtdf2
WARNING: unicorn_pci_atm.ko needs unknown symbol __floatsidf
WARNING: unicorn_pci_atm.ko needs unknown symbol __adddf3
WARNING: unicorn_pci_atm.ko needs unknown symbol __fixdfsi
WARNING: unicorn_pci_atm.ko needs unknown symbol __ledf2
WARNING: unicorn_pci_atm.ko needs unknown symbol __negdf2
WARNING: unicorn_pci_atm.ko needs unknown symbol __divdf3
WARNING: unicorn_pci_atm.ko needs unknown symbol __muldf3
WARNING: unicorn_pci_atm.ko needs unknown symbol __gedf2
WARNING: unicorn_pci_atm.ko needs unknown symbol __subdf3

Evidemment le module n'est pas chargé.

Le driver Bewan utilise aussi des objets générés par C++.

J'ai passé l'après-midi sur cette "connerie" et j'en ai hyper-marre.

Je pense qu'il faut trouver la bonne option de gcc (ou ld ?) mais je sèche.

gcc 3.3.2 et utilisation de kbuild.

Merci pour toute info.

btw : si quelqu'un est intéressé par ce driver sous Linux 2.6, qu'il me fasse signe. Normalement Bewan devrait faire le boulot mais je n'avais pas envis d'attendre (surtout que la date reste inconnue...).
  • # Re: Help C++ et modules Linux 2.6

    Posté par  . Évalué à 1.

    J'oubliais, ces fonctions ne sont pas dans libgcc.
    • [^] # Re: Help C++ et modules Linux 2.6

      Posté par  (site web personnel) . Évalué à 2.

      Ce sont des fonctions flottantes, ce qui est louche si tu es en train de compiler un module noyau (puisqu'il ne devrait pas y en avoir dans le noyau - sauf exceptions, dans ce cas il faut les délimiter par kernel_fpu_begin/end et de toute manière on ne fait pas appel à la librairie mathématique).

      Je pense que c'est gcc qui génère du code flottant pour "optimiser" certaines choses (à cause du fait qu'il s'agit de code c++ surement) Il faudrait peut etre lui dire de se calmer mais je vois pas trop comment...

      Voilà, désolé mais c'est tout ce que je sais :)
      • [^] # Re: Help C++ et modules Linux 2.6

        Posté par  . Évalué à 2.

        J'ai trouvé le problème. Tu as vu juste.

        Le noyau n'a pas à utiliser de flottants. De plus certains cpu n'ont pas d'unité virgule floattant (y en a encore ?).

        kbuild fixe les flags du noyau et il y a :
        -msoft-float : calcule flottant fait par logiciel (d'où les appels à __eqdf2, ...).

        Normalement libgcc doit fournir les fonctions. Comme c'est pour le noyau, il faut que j'utiliser libgcc.a . Mais voilà, ce n'est pas dans libgcc.a . Il faut remarquer que par défaut gcc compile avec -mhard-float .

        En solution temporaire, j'ai ajouté -mhard-float dans les flags de compilation.
        Comme autre solution, je peut aussi compiler gcc/floatlib.c (solution software pour les calcules en virgule flottante) qui est dans les sources gcc et l'ajouter au modules. Le module est dans ce cas plus gros. En fouillant dans gcc, gcc/libgcc-std.ver semble indique que ces fonctions vont être abandonnés (elle se sont pas dans libgcc.a ni dans libgcc_s.so si la version est supérieur à 3.3 (ce qui est mon cas et n'est peut-être pas le cas du développeur bewan)).

        Maintenant le module se charge mais il se plante lamentable. Je vais déjà tester avec gcc/floatlib.c puis faire un audite pour voir si je n'est pas loupé quelques chose depuis toutes les modifications que j'ai (c'est pas grand chose mais j'ai perdu le fil).

        Le driver à un fichier objet proprio et c'est dans ce fichier que ça plante. C'est mal parti :-(

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.