t/apr-ext failures at gcc -O0

Niko Tyni <[email protected]>
Newsgroups gmane.comp.apache.mod-perl.devel
Message-ID <[email protected]>
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   [email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
0001-Define-MP_IN_XS-to-avoid-referencing-perl_module-out.patch (text/x-diff, 1.7 KB)
From 91c69a8df6d63c2bea0377e59e7b58a81d60f607 Mon Sep 17 00:00:00 2001
From: Niko Tyni <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.