2002-04-09 12:59:48

by Dmitry A. Fedorov

[permalink] [raw]
Subject: Re: C++ and the kernel (fwd)


On Tue, 9 Apr 2002, T. A. wrote:

> I am in the initial stages of writing some C++ wrapper classes for the

At first, look this:
http://www.inp.nsk.su/~fedorov/export/linux-cxx-test-1.20.tar.gz

Yes, it is possible to write kernel modules in C++ and I do,
but it does not have much sense to use wrappers. Use classes only
for complex data structures, lock and so forth.

> kernel. So far its been an interesting process, mainly due to the use of
> some C++ keywords in the kernel header files. Mostly gratuitous at that as

There are many issues with C++ and kernel and keywords problem is
least significant and easy solved without of any kernel patching.

> So far my overloading of "new" works if I compile the module without
> exceptions (-fno-exceptions). This is fine for myself as I prefer checking
[...]
> object file. Does someone know how I can resolve this?

Don't use C++ exceptions at all until you resolve all of problems
concerned with them.

> limitation in how gcc's "alias" feature is used. Apparently for C++ one
> must pass the mangled name of the function in question. Is there a gcc
> macro or function of some kind to do something like this:

Don't use wrapper classes and the problem is not appeared at all.
Any of C++ kernel modules must have both C and C++ sources.

> int init_module() __attribute__((alias(mangle_name("load__9my_module"))));

There are many places with sources of demangling flying around,
but mangling sources is only in one place - g++ :(
And note, that default mangling algorithm of g++ is changed
periodically. So, forget about it.

> Another issue that I currently have is that I haven't been able to
> figure out a way to get the module to properly initiate global objects.
[...]
> Anyone know how I can get gcc to insert the global initiation
> code from within init_module?

Look at my sources, linux/cxx/xtors* and the cxx-test module's
Makefile

> So far C++'s use of the kernel headers has found a couple of areas in
> which possible bugs exists. In one header file the typedef ssize_t is used
> despite its definition not appearing in the source file or any of the
> included header files. I've also encountered negative numbers being
> assigned to unsigned numbers without a cast.

Yes, kernel code is pretty inaccurate is such relation.
I have use most strict g++ warning options to reduce probability of
some bugs in my code. Use 'STRICT=y make config' command to swith
these options on.

To prevent flooding by warnings from kernel headers, I have local
patches:
http://www.inp.nsk.su/~fedorov/export/linux-warning-cleaned-headers-1.9.tar.gz
which are not supplied to customers.

--