| kadreg |
Ace17 a écrit a écrit :
Ben de toutes manieres une fois que c'est compilé, les deux devraient marcher non?
|
Je viens de faire l'essai. J'ai déclaré init_module et cleanup_module en extern "C" pour contourner le mecanisme de nommage C++ dans les .o (différent de celui du C, je le rappelle), mais j'ai quand même des problème de compilation (printk introuvable).
Qu'a cela ne tienne, je redeclare moi même printk dans mon fichier, je met une déclaration de classe, son instanciation et ça suppression, et ça compile, mais ne se charge pas :
[root@luggage modules]# /sbin/insmod helloModule.o helloModule.o: unresolved symbol __builtin_delete
helloModule.o: unresolved symbol __builtin_new
helloModule.o: Hint: You are trying to load a module without a GPL compatible license
and it has unresolved symbols. Contact the module supplier for
assistance, only they can help you.
[root@luggage modules]#
|
Et oui, les operateurs new et delete ne sont pas définis au niveau du langage mais de la libstdc++, donc, c'est DMC pour ces deux operateurs.
Au final, j'ai reussi a compiler un module :
Code :
- #define MODULE
- #include <linux/module.h>
- #define MODULE_NAME "kad_module"
- extern "C" int printk(const char * fmt, ...);
- class toto {
- int id;
- public:
- void hello () {
- printk ("<1> kadreg : hello on a toto\n" );
- }
- };
- static int hello_my_integer;
- extern "C" {
- int init_module (void){
- printk ("<1> kadreg : my first module : %s ! \n", MODULE_NAME);
- toto my_toto;
- my_toto.hello ();
- return 0;
- }
- void cleanup_module (void){
- printk ("<1> kadreg : unload module : %s ! \n", MODULE_NAME);
- toto my_toto;
- my_toto.hello ();
- }
- }
|
Qui m'affiche des trucs (a part le fait que ça va tainter mon kernel :) ) :
Jun 23 10:18:19 luggage kernel: kadreg : my first module : kad_module ! Jun 23 10:18:19 luggage kernel: kadreg : hello on a toto
Jun 23 10:18:21 luggage kernel: kadreg : unload module : kad_module ! Jun 23 10:18:21 luggage kernel: kadreg : hello on a toto
|
Donc a priori, on peut ecrire des drivers linux en c++, mais on n'a pas fini de se faire chier sur des conneries. |