Hi, we're seeing t/apr-ext failures when building without optimization on current Debian unstable (Apache 2.4.10, Perl 5.18.2). An example is
t/apr-ext/base64.t ...................... Can't load '/home/niko/tmp/libapache2-mod-perl2/blib/arch/auto/APR/APR.so' for module APR: /home/niko/tmp/libapache2-mod-perl2/blib/arch/auto/APR/APR.so: undefined symbol: perl_module at /usr/lib/perl/5.18/DynaLoader.pm line 184. at /home/niko/tmp/libapache2-mod-perl2/blib/lib/APR/Base64.pm line 23. Compilation failed in require at /home/niko/tmp/libapache2-mod-perl2/blib/lib/APR/Base64.pm line 23. BEGIN failed--compilation aborted at /home/niko/tmp/libapache2-mod-perl2/blib/lib/APR/Base64.pm line 23. Compilation failed in require at /home/niko/tmp/libapache2-mod-perl2/t/lib/TestAPRlib/base64.pm line 12. BEGIN failed--compilation aborted at /home/niko/tmp/libapache2-mod-perl2/t/lib/TestAPRlib/base64.pm line 12. Compilation failed in require at t/apr-ext/base64.t line 8. BEGIN failed--compilation aborted at t/apr-ext/base64.t line 8. t/apr-ext/base64.t ...................... Dubious, test returned 2 (wstat 512, 0x200) No subtests run It looks like APR.so can only be loaded from inside mod_perl: % perl -Iblib/lib -Iblib/arch -MAPR -e1 Can't load 'blib/arch/auto/APR/APR.so' for module APR: blib/arch/auto/APR/APR.so: undefined symbol: perl_module at /usr/lib/perl/5.18/DynaLoader.pm line 184. at -e line 0. Compilation failed in require. BEGIN failed--compilation aborted. The problem comes from src/modules/perl/modperl_apache_includes.h: #if !defined(MP_IN_XS) && AP_MODULE_MAGIC_AT_LEAST(20100606, 0) APLOG_USE_MODULE(perl); #endif where APLOG_USE_MODULE(perl) expands via /usr/include/apache2/http_config.h to extern module perl_module; static int * const aplog_module_index = &(perl_module.module_index); At -O2, this is optimized away when it's not used, but -O0 keeps it. The MP_IN_XS guard looks promising; defining that for the APR (and APR/PerlIO) build seems to help. I was able to get the test suite pass at both -O0 and -O2 with the attached patch. It seems possible that other parts of xs/ are affected too but aren't exercised by the test suite. The history of MP_IN_XS usage is just http://svn.apache.org/viewvc?view=revision&revision=1410295 http://svn.apache.org/viewvc?view=revision&revision=68792 but it looks like a "correct" solution to me. Does that make sense? I'm attaching a patch that modifies the Makefile.PL files accordingly. I expect there are other ways to accomplish the same thing too. This is also https://bugs.debian.org/756989 (cc'd). -- Niko Tyni nt...@debian.org
>From 91c69a8df6d63c2bea0377e59e7b58a81d60f607 Mon Sep 17 00:00:00 2001 From: Niko Tyni <nt...@debian.org> Date: Mon, 4 Aug 2014 10:32:36 +0300 Subject: [PATCH] Define MP_IN_XS to avoid referencing &perl_module outside of mod_perl APLOG_USE_MODULE(perl) expands to extern module perl_module; static int * const aplog_module_index = &(perl_module.module_index); which makes loading APR.so impossible outside mod_perl unless aplog_module_index is optimized away by the compiler. This causes mod_perl test suite failures in t/apr-ext at "gcc -O0". See also http://svn.apache.org/viewvc?view=revision&revision=68792 http://svn.apache.org/viewvc?view=revision&revision=1410295 Bug-Debian: https://bugs.debian.org/756989 --- xs/APR/APR/Makefile.PL | 7 +++++++ xs/APR/PerlIO/Makefile.PL | 3 +++ 2 files changed, 10 insertions(+) diff --git a/xs/APR/APR/Makefile.PL b/xs/APR/APR/Makefile.PL index 8745a54..d569dde 100644 --- a/xs/APR/APR/Makefile.PL +++ b/xs/APR/APR/Makefile.PL @@ -25,6 +25,13 @@ $libs = delete $args{LIBS} if $args{LIBS}; my $build = ModPerl::BuildMM::build_config(); +my $ccopts = $build->ccopts; + +# avoid referencing &perl_module outside of mod_perl +$ccopts .= ' -DMP_IN_XS'; + +$args{CCFLAGS} = $ccopts; + my @apru_link_flags = $build->apru_link_flags; $libs .= join ' ', @apru_link_flags if @apru_link_flags; diff --git a/xs/APR/PerlIO/Makefile.PL b/xs/APR/PerlIO/Makefile.PL index 4a8f60d..ca102bb 100644 --- a/xs/APR/PerlIO/Makefile.PL +++ b/xs/APR/PerlIO/Makefile.PL @@ -25,6 +25,9 @@ if ($build->has_large_files_conflict) { : ''; } +# avoid referencing &perl_module outside of mod_perl +$ccopts .= ' -DMP_IN_XS'; + ModPerl::BuildMM::WriteMakefile( NAME => 'APR::PerlIO', VERSION_FROM => 'PerlIO.pm', -- 2.0.1
--------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@perl.apache.org For additional commands, e-mail: dev-h...@perl.apache.org