Radoslaw Zielinski wrote:
Each time I upgrade perl and the DynaLoader's version changes, I have to
rebuild mod_perl, or I'll get this error:
  DynaLoader object version 1.05 does not match $DynaLoader::VERSION 1.06

It happens when I add "PerlModule AnyXSmodule" to my httpd.conf (of
course any more complicated thing, like adding a handler or a <perl>
section also triggers it).  The module itself of course works just fine
outside mod_perl.

I finally found some time to dig the issue; when I grepped out the

  src/modules/perl/modperl_xsinit.c:    /* DynaLoader is a special case */

line I knew I'm home... ;-)  The problematic call is:

  newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);

It's triggered in mod_perl.c::modperl_xs_init(), for whatever reason.
DynaLoader.pm contains:

  boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) &&
                                  !defined(&dl_error);

When I test it from the command line, the &dl_error is always defined,
so I think on my system the condition is always false.

My question is: what's the point of that newXS() call?  Can it be done
in any other way?

1) You need to have DynaLoader loaded before anything else, so you can load .so Perl extensions. That's why you see all those things. more explanation below.


2) DynaLoader.a is statically linked with mod_perl.so, therefore every time you upgrade perl you need to rebuild mod_perl (which is not the only reason).

--------

if you ever write an embedded perl app, which needs to load .pm files with .so extensions, you need to write:

#include <EXTERN.h>
#include <perl.h>

EXTERN_C void xs_init (pTHX);

EXTERN_C void boot_DynaLoader (pTHX_ CV* cv);

EXTERN_C void
xs_init(pTHX)
{
       char *file = __FILE__;
       dXSUB_SYS;
       /* DynaLoader is a special case */
       newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
}
int main(int argc, char **argv, char **env)
{
[...]
    perl_construct(perl);
    perl_parse(one_perl, xs_init, 3, embedding, (char **)NULL);
    /* DynaLoader must be preloaded before perl_clone, if DynaLoader
     * is to be required later */
    eval_pv("require DynaLoader;", TRUE);

now you can continue loading other things.
See perlembed.pod for more info.

--
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to