From: Bill Moseley
Sent: Wednesday, October 01, 2014 1:12 AM
To: perl-xs@perl.org
Subject: Re: Two XS modules linked to one .a library.

Just to clarify I was meaning the symbols in the shared third-party .a library. Where two separate Perl (XS) modules link to the same static .a library and those two Perl modules are then used in the same program.

Yep - that's as I took it to be.
Neither of those perl modules knows (nor needs to know) anything about the contents of the other module's .so. The linking to the .a library is all done when the module is compiled. As long as that worked, your only concern is avoiding having both modules export a sub of the same name - in which case you'll get a "subroutine redefined" warning, anyway (if you've turned warnings on).

We are going to try and get the .a library built as a .so file (or really many .so libraries). As it is right now it's kind of a beast so the resulting Perl XS-build .so files are quite big. Seems like a cleaner approach, and that would allow patching the third-party library w/o having to rebuild the Perl modules.

One interesting side note about using 2 perl modules (that access the same library) being used in the *same process*:

Let's call the modules FOO and BAR, and assume they both contain a set_global() function and a get_global() function. The set_global() function sets a *C library* global to some value, and the get_global() function returns the current value of that library global.

If you've built both FOO and BAR against a static library, then altering the value of the global by running FOO::set_global($newval) won't have any effect on the value returned by BAR::get_global(), which will remain unchanged. (And vice-versa.) But if you've built FOO and BAR against a shared library, then both BAR::get_global() and FOO::get_global() will always return identical values - and the value returned will be whatever the most recent set_global() call specified (irrespective of which module made that call).

If your modules happen to both be capable of setting a particular library global, you should be able to verify that quite easily.

Of course, if both FOO and BAR are being run in separate processes, then there's no such issue. (Not sure what happens when FOO and BAR, built against the same shared library, are run in different threads of the same process ... I'm guessing it might depend upon the thread-safety of the shared library.)

Math::GSL is one module where this is a consideration. There's an option to set an error handling global - but that turns out to be not at all global if Math::GSL is built against a static gsl library, because all of the Math::GSL sub-modules have their own .so linked to the static gsl library. This is just like the situation you've outlined for your current setup, except Math::GSL has about 30 modules, not just 2.

Cheers,
Rob

Reply via email to