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

Reply via email to