Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Feb 1998 14:38:44 +0100
From:      Eivind Eklund <eivind@yes.no>
To:        Terry Lambert <tlambert@primenet.com>, Eivind Eklund <eivind@yes.no>
Cc:        current@FreeBSD.ORG
Subject:   Re: Heads up: static -ification
Message-ID:  <19980212143844.44164@follo.net>
In-Reply-To: <199802100857.BAA22938@usr05.primenet.com>; from Terry Lambert on Tue, Feb 10, 1998 at 08:57:11AM %2B0000
References:  <19980210030906.20113@follo.net> <199802100857.BAA22938@usr05.primenet.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Feb 10, 1998 at 08:57:11AM +0000, Terry Lambert wrote:
> > > Remember that functions and variables are exported interfaces in
> > > many cases.  This includes user space uses for "ps", "w", "netstat",
> > > and so on, as well as kernel space uses.
> > 
> > I know.  I hope I didn't break any of them; the suspicion that I might
> > have was the reason for sending the heads-up in the first place.
> > 
> > I though fixing this (the extreme spread of kernel symbols) was worth
> > the potential trouble.
> > 
> > BTW: Speaking of symbol spread - you once gave a reference to the ld
> > manpage and implied that it was possible to create new object files
> > included a specific subset of the symbols from the original object
> > files.  I tried to find out how to do this, as I wanted it both for
> > the kernel and for libalias, but I've spent quite some time without
> > finding out how to do it.  Would you mind giving detailed
> > instructions?  (Re-creating object files is easy, the problem is
> > controlling which symbols to include on a fine-grained basis).
> 
> You should look at the man page again.  Keep in hand a copy of the nm
> man page with reference to the "-g" option, and a copy of the modload
> source code.

The implied pointer to the LKMs made me discover the solution - just as I
had discovered it by myself :-)

symorder can be used to restrict symbols, too.  I can't see anything else
that does this job.  And a simple reference to 'symorder' would have been
all I needed.

[... On what my staticization might have broken ...]
> If I don't miss my guess, this was either in the console code (World21
> uses this to replace the console with an internalized console capable
> of displaying 21 different locales -- one at a time) or it's in the
> NFS lease function pointer management.  Those are the two examples that
> spring to mind.

It was some MIDI-stuff in VoxWare.  And I don't think it was intended as an
LKM hook.

> You may wish to explicitly contact binary driver vendors (like Dennis
> at ETINC), who may depend on unknown symbols.

He hasn't complained yet... :-)

> I definitely agree that the interfaces should be pruned, for what it's
> worth.  I'm not quite to the point that I agree with the Linux/AIX or
> Microsoft link ".DEF" file approach to defining external interfaces to
> objects, but a directive to decide which symbol table in an ELF file, for
> instance, would probably be acceptable to everyone, especially if it
> were a macro wrapped storage class specifier or a #pragma of some kind
> (we will need these for marking things pageable and "non-load" for the
> kernel loader at some point, anyway).

The problem is that we have subsystems that share symbols internally, but
shouldn't expose those symbols to the rest of the world.  I'd like a
hierarchical model where we the kernel is the top node of a tree, and each
node in the tree have a defined exported interface, and all symbols not in
that interface will be removed.  Each node will be implemented as an object
file, but might be constructed by re-linking subnodes through ld -r and a
pass through symorder -c to zap non-wanted symbols.

This has two good effects:
(1) Limiting exposure of symbols as much as possible, so incestous
    relationships don't develop so easily.
(2) Minimizing re-link time, as only the parts of the kernel that really has
    changed will be re-linked.

OTOH, I think this might be too large a change for people to swallow.

> Once this is done, along with your other changes, then we will be a long
> way down the road of having a documentable DDI/DKI that we can stick with
> to get vendors to start writing binary drivers for their hardware for
> FreeBSD (I'm sure the aforementioned Dennis would be happy with this).

I'd like it, at least.  I'm hacking drivers, too, though not usually sending
it out as LKMs.

> A lot of problems like this come from subsystem exposure.  Veto interfaces
> will definitely reduce the kernel symbol "footprint" of subsystems (my
> favorite hobby horse here is the VOP_ADVLOCK code in the FS's).  Most
> of these are violations of the "downcalls only, no upcalls" rule that
> any beginning professional interface designer must know.

I actually dislike the use of calls between layers at all (or at least in
almost all cases).  Layers should communicate through asynchronous messages;
that way, you avoid a lot of stupid implict ordering assumptions.

> In any case, keep up the good work; I only meant to caution you about the
> amount of exposure that was dependended upon; I in no way advocate it,
> nor do I hold it up as an example of "good engineering practice".  ;-).

I actually think I've zapped all the variables that can turn static.  The
next stage would be to go for the module-variables, but that need a
re-design of the kernel link process as outlined above.

Eivind.

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe current" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19980212143844.44164>