Soruce file layout
Daniel Richard G.
skunk at iSKUNK.ORG
Mon Jul 17 16:29:21 UTC 2006
On Mon, 2006 Jul 17 06:59:32 -0400, David Quigley wrote:
> Hello,
> I was looking through the modules directory for the PAM sources and it
> seems that almost all of the modules exist in one source file in which
> every function is static except for the main PAM exports. Is there a
> reason for that? Is there a reason for not breaking a large module up
> into smaller source files?
>
I'll try a stab at this, as this is more a C thing than anything
PAM-specific.
The reason is to produce a shared object with no other externally-visible
symbols beyond the standard PAM functions. If you break the module up into
multiple objects, this will usually involve module-internal functions that
are nonetheless exported, which can be problematic.
E.g. if the pam_sm_open_session() function is in foo-session.c, but it
calls out to a routine do_blah() in foo-common.c, then the resulting foo.so
PAM module will show do_blah() as an export alongside the standard PAM
entry points. This is bad if the consuming application links against
another shared library that also has a do_blah() export.
Now, there are various ways to address this issue:
1. Prefix the module-internal-but-non-static symbols with e.g. "__foo_"
(__foo_do_blah() and so on), to reduce the risk of namespace collisions
2. Use Libtool's symbol-visibility functionality to hide the
module-internal symbols (may not work on all platforms)
3. Have various source files, but declare all module-internal functions
static and compile a single master source file that #includes all the
others
4. Implement each PAM function in a separate source file, with all other
functions declared static (simple but inflexible)
As for why Linux-PAM doesn't take these approaches more often... well, most
modules aren't that big, and the single-source-file MO is simpler :-)
HTH,
--Daniel
--
NAME = Daniel Richard G. ## Remember, skunks _\|/_ meef?
EMAIL1 = skunk at iskunk.org ## don't smell bad--- (/o|o\) /
EMAIL2 = skunk at alum.mit.edu ## it's the people who < (^),>
WWW = http://www.******.org/ ## annoy them that do! / \
--
(****** = site not yet online)
More information about the Pam-list
mailing list