Compiling C++ kernel module + Makefile
Quoted 25 lines · Richard B. Johnson
Quoted 20 lines · Bart Samwel
Quoted 7 lines · Richard B. Johnson
If somebody actually got a module, written in C++, to compile and work on linux-2.4.nn, as you state, it works only by fiat, i.e., was declared to work. There is no C++ runtime support in the kernel for C++. Are you sure this is a module and not an application? Many network processes (daemons) are applications and they don't require any knowledge of kernel internals except what's provided by the normal C/C++ include-files.
Rest assured, ;) this is definitely a module. It includes a kernel patch that makes it possible to include a lot of the kernel headers into C++, stuff like changing asm :: to asm : : (note the space, :: is an operator in C++) and renaming "struct namespace" to something containing less C++ keywords. The module also includes rudimentary C++ runtime support code, so that the C++ code will run inside the kernel. I'm afraid that the task of compiling it for 2.6 is going to be pretty tough -- the kernel needs loads of patches to make it work within a C++ extern "C" clause, and it probably completely different patches from those needed by 2.4. Getting the build system to work is the least of the concerns.
Quoted 2 lines
-- Bart
Quoted 9 lines
I can't imagine why anybody would even attempt to write a kernel module in C++. Next thing it'll be Visual BASIC, then Java. The kernel is written in C and assembly. The tools are provided. It can only be arrogance because this whole C v.s. C++ thing was hashed-over many times. Somebody apparently wrote something to "prove" that it can be done. I'd suggest that you spend some time converting it to C if you need that "module". The conversion will surely take less time than going through the kernel headers looking for "::".
I doubt. I have module which uses templates to get support for couple of possible userspace interfaces which existed over time, and it works very well, without any changes to the kernel headers. Only thing I had to do was:
#ifdef __cplusplus
# define new new_member # define private private_member # define namespace namespace_member
#endif
and extern "C" around #includes.
Of course that it is possible to do everything what templates do with #define, but why do that in complicated ways if it can be done much simpler?
Of course this module does not use exceptions or rtti, just templates and static class members.
Module compiles on 2.2.0 to 2.6.1, with gcc 2.95-3.4. If you'll limit yourself to gcc-3.0 or later, you do not have to worry about ::/: : at all, as gcc's c++ parser gets it right after 2.95.
Petr Vandrovec