Re: mod_perl segfaults, can't start Apache

John Manko <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <CAFbfbv+jZ0jo3ubPqqgETzJoMFhi9=Keo7g9h+Z-_=Pqmin6tA@mail.gmail.com>
Chris, that seems to have solved my problems.  Though, I used the package
env config as described in the Gentoo Wiki (
http://wiki.gentoo.org/wiki//etc/portage/env).  For those having this
problem, simple create the following problems and rebuild perl and mod_perl

/etc/portage/env/www-apache_mod_perl.conf:
CFLAGS="${CFLAGS} -D_FILE_OFFSET_BITS=64"

/etc/portage/package.env:
www-apache/mod_perl    www-apache_mod_perl.conf
dev-lang/perl        www-apache_mod_perl.conf

Now, I wasn't sure if adding the www-apache/mod_perl was required or not,
but I included it anyway.

So, mod_perl builds fine and apache is running.  I have other problems
related to Bugzilla and perl modules, but I don't think it's related.  I
will follow up if it is.

Thank you, everyone!  I could not have figured this out without your help.
Much appreciated.

On Wed, Jun 27, 2012 at 6:00 PM, Christopher Hall <[email protected]> wrote:

> I've been seeing the same problem on Gentoo.  I think this is the same
> issue as described at
> http://www.gossamer-threads.com/lists/perl/porters/263222 .
>
> When perl is compiled, the optimisation switches in the CFLAGS in
> make.conf are used, together with some autodetected ones.  When perl
> modules, such as mod_perl, are built later, the CFLAGS from the
> currently-installed perl are extracted, and used by themselves,
> without the autodetected ones.
>
> In this case, the perl compilation was using my CFLAGS, together with
> -D_FILE_OFFSET_BITS=64 (among other things).  But mod_perl (and all
> other perl modules written in C) are only picking up the CFLAGS.  This
> causes a difference in ABI, and hence the crash.
>
> If I add -D_FILE_OFFSET_BITS=64 to the end of my CFLAGS in make.conf,
> and recompile perl, then this define still gets added to the compiler
> switches -- where it does no harm being specified twice.  If I then
> recompile mod_perl, this now includes that switch, after which
> everything works fine.
>
> I've since created /etc/portage/env/dev-lang/perl with
> CFLAGS="$(CFLAGS) -D_FILE_OFFSET_BITS=64" to save having to alter the
> make.conf globally.  This approach ought to be sufficient, but I
> haven't had chance to test it.
>
> In case it's useful to anyone, here is the stack trace I was getting
> before fixing the problem:
>
> # gdb --args apache2 -D DEFAULT_VHOST -D PERL
> GNU gdb (Gentoo 7.4.1 p1) 7.4.1
> Copyright (C) 2012 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <
> http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "i686-pc-linux-gnu".
> For bug reporting instructions, please see:
> <http://bugs.gentoo.org/>...
> Reading symbols from /usr/sbin/apache2...Reading symbols from
> /usr/lib/debug/usr/sbin/apache2.debug...done.
> done.
> (gdb) r
> Starting program: /usr/sbin/apache2 -D DEFAULT_VHOST -D PERL
> warning: Could not load shared library symbols for linux-gate.so.1.
> Do you need "set solib-search-path" or "set sysroot"?
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib/libthread_db.so.1".
>
> Program received signal SIGSEGV, Segmentation fault.
> 0xb7f0f174 in modperl_env_clear (my_perl=0x8227330) at modperl_env.c:100
> 100         HV *hv = ENVHV;
> (gdb) where
> #0  0xb7f0f174 in modperl_env_clear (my_perl=0x8227330) at
> modperl_env.c:100
> #1  0xb7efcfea in modperl_boot (my_perl=0x8227330, data=0x0) at
> mod_perl.c:100
> #2  0xb7e01681 in Perl_leave_scope (my_perl=0x8227330, base=0) at
> scope.c:970
> #3  0xb7e024f3 in Perl_pop_scope (my_perl=0x8227330) at scope.c:110
> #4  0xb7d5714b in S_parse_body (xsinit=0xb7efcf70 <modperl_xs_init>,
> env=0x0, my_perl=0x8227330) at perl.c:2270
> #5  perl_parse (my_perl=0x8227330, xsinit=0xb7efcf70
> <modperl_xs_init>, argc=2, argv=0x81862d0, env=0x0) at perl.c:1633
> #6  0xb7efd3a6 in modperl_startup (s=0x80b9c08, p=0x80b40a8) at
> mod_perl.c:255
> #7  0xb7efd31c in modperl_startup (s=0x80b9c08, p=0x80b40a8) at
> mod_perl.c:207
> #8  0xb7efd856 in modperl_init (base_server=0x80b9c08, p=0x80b40a8) at
> mod_perl.c:458
> #9  0xb7efda0e in modperl_hook_init (s=0x80b9c08, pconf=0x80b40a8,
> plog=<optimized out>, ptemp=<optimized out>) at mod_perl.c:631
> #10 modperl_hook_init (pconf=0x80b40a8, plog=0x80e2160,
> ptemp=0x80e4168, s=0x80b9c08) at mod_perl.c:608
> #11 0x0807d589 in ap_run_open_logs (pconf=0x80b40a8, plog=0x80e2160,
> ptemp=0x80e4168, s=0x80b9c08) at config.c:151
> #12 0x080680d3 in main (argc=5, argv=0xbfffe3e4) at main.c:680
> (gdb) list
> 95          }
> 96      }
> 97
> 98      void modperl_env_clear(pTHX)
> 99      {
> 100         HV *hv = ENVHV;
> 101         U32 mg_flags;
> 102
> 103         modperl_env_untie(mg_flags);
> 104
> (gdb) disassemble
> Dump of assembler code for function modperl_env_clear:
>   0xb7f0f150 <+0>:     sub    $0x1c,%esp
>   0xb7f0f153 <+3>:     mov    %esi,0x14(%esp)
>   0xb7f0f157 <+7>:     mov    0x20(%esp),%esi
>   0xb7f0f15b <+11>:    mov    %ebx,0x10(%esp)
>   0xb7f0f15f <+15>:    call   0xb7efc977 <__i686.get_pc_thunk.bx>
>   0xb7f0f164 <+20>:    add    $0x17e90,%ebx
>   0xb7f0f16a <+26>:    mov    %edi,0x18(%esp)
>   0xb7f0f16e <+30>:    mov    0x2ec(%esi),%eax
> => 0xb7f0f174 <+36>:    mov    0xc(%eax),%eax
>   0xb7f0f177 <+39>:    mov    0x14(%eax),%eax
>   0xb7f0f17a <+42>:    mov    0x8(%eax),%edi
>   0xb7f0f17d <+45>:    mov    %edi,%edx
>   0xb7f0f17f <+47>:    and    $0xe00000,%edi
>   0xb7f0f185 <+53>:    and    $0xff1fffff,%edx
>   0xb7f0f18b <+59>:    mov    %edx,0x8(%eax)
>   0xb7f0f18e <+62>:    mov    %eax,0x4(%esp)
>   0xb7f0f192 <+66>:    mov    %esi,(%esp)
>   0xb7f0f195 <+69>:    call   0xb7efc3d0 <Perl_hv_clear@plt>
>   0xb7f0f19a <+74>:    mov    0x2ec(%esi),%eax
>   0xb7f0f1a0 <+80>:    mov    0xc(%eax),%eax
>   0xb7f0f1a3 <+83>:    mov    0x14(%eax),%eax
>   0xb7f0f1a6 <+86>:    or     %edi,0x8(%eax)
>   0xb7f0f1a9 <+89>:    mov    0x10(%esp),%ebx
>   0xb7f0f1ad <+93>:    mov    0x14(%esp),%esi
>   0xb7f0f1b1 <+97>:    mov    0x18(%esp),%edi
>   0xb7f0f1b5 <+101>:   add    $0x1c,%esp
>   0xb7f0f1b8 <+104>:   ret
> End of assembler dump.
> (gdb) info registers
> eax            0x0      0
> ecx            0x0      0
> edx            0x822ed28        136506664
> ebx            0xb7f26ff4       -1208848396
> esp            0xbfffde40       0xbfffde40
> ebp            0x80b9c08        0x80b9c08
> esi            0x8227330        136475440
> edi            0x80b40a8        134955176
> eip            0xb7f0f174       0xb7f0f174 <modperl_env_clear+36>
> eflags         0x10282  [ SF IF RF ]
> cs             0x73     115
> ss             0x7b     123
> ds             0x7b     123
> es             0x7b     123
> fs             0x0      0
> gs             0x33     51
> (gdb) c
> Continuing.
>
> Program terminated with signal SIGSEGV, Segmentation fault.
> The program no longer exists.
> (gdb) q
>
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.