Re: mod_perl segfaults, can't start Apache
Christopher Hall <[email protected]>
| Newsgroups | gmane.comp.apache.mod-perl |
|---|---|
| Message-ID | <CAB4OWr2dDYSvvVv0xZ1YdN_1LkT54FP9xnXWbW8-R9Es_b3q9Q@mail.gmail.com> |
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