Prefixing system calls to eliminate namespace collisions between kernel and libc

Robert Watson rwatson at FreeBSD.org
Sun Aug 28 14:34:27 UTC 2011


On Sun, 28 Aug 2011, K. Macy wrote:

> NetBSD long ago made this change as well. and for linux this may always have 
> been the case. Linking POSIX programs against parts of the kernel can 
> actually be done just by mangling things during dynamic linking, so doesn't 
> require the above, but it is certainly easier and more portable with the 
> above. Ultimately I would like my userspace network stack to be able to run 
> on windows as well. I don't think that I have the same flexibility there 
> with regards to linker scripts.

This seems pretty reasonable to me.  The reason I have considered similar 
changes in the past was the additional case you cite above: it makes it a bit 
easier to link a POSIX-based application directly into the FreeBSD kernel. 
As you point out, we could address that problem by teaching our kernel linker 
about different namespaces, handling mangling at load-time.  However, I think 
your approach works better as it avoids the need for "special" linkage.

There are a number of other potential areas of collisions that I'm aware of:

(1) libc-like interfaces such as malloc(9), which differs observably from
     malloc(3); libkern is mostly the same (and often literally the same code)
     but it could be other tweaks are required.  One fix here is to move to
     calling our kernel malloc kmalloc(9).  I see that as a somewhat larger
     change though, but perhaps less pressing as it's a very small number of
     collisions that we can handle explicitly.

(2) Other libraries that are derived from or share code with the kernel, but
     that might have interfaces with different semantics.  libsbuf and libbsm
     come particularly to mind, but there might well be others.  I think these
     can be fixed without too much trouble, and I'm happy to ponder the libbsm
     case myself.

(3) The kernel RPC code, which uses interfaces very much like userspace.  It
     could be that, in fact, they are the same APIs in userspace, but we will
     need to check as that's a non-trivial part of the symbol namespace.  This
     might be particularly relevant if you want userspace RPC code to be able
     to use your userspace instance of the network stack.  Possibly prefixing
     'k' in front of a lot of things would be useful here as well...

In general, consider me supportive of this cleanup -- it would make a number 
of things I'd like to do much easier.  Abstractly, it seems like we should 
treat the two namespaces as being completely independent (hence thoughts of 
symbol mangling in the linker), but in practical terms it should be quite 
useful and might prevent having to solve much harder problems.

On a semi-related note: it would be nice if the kernel had an explicit symbol 
export list for kernel symbols, as our modules themselves support.  This would 
make it easier to discourage third parties from using "less public" interfaces 
in kernel modules, which tends to make those kernel modules fragile in the 
presence of regular baseline development...

Robert


More information about the freebsd-arch mailing list