Back in Oct 2003, Joachim Feise started the thread: http://marc.theaimsgroup.com/?l=apache-modperl&m=106583644716604&w=2 Subject: [mp1] segfault with Perl 5.8.1 and mod_perl 1.29
I have had similar problems with segfaults upon the first request and traced it to a structure packing and alignment mismatch, because of compile-time -Ddefines... mismatch between compiling mod_perl.so and Apache. Notice how the address of r->per_dir_config changes between http_config.c and mod_perl.c, even though the address of the request_rec r is the same: Breakpoint 1, run_method (r=0x81f7384, offset=21, run_all=1) at http_config.c:370 370 result = (*mod_handler) (r); (gdb) print &r->per_dir_config $1 = (void **) 0x81f74d0 (gdb) print r->per_dir_config $2 = (void *) 0x81f806c (gdb) stepi 0x08053b09 370 result = (*mod_handler) (r); (gdb) 0x08053b0c 370 result = (*mod_handler) (r); (gdb) 0x08053b0f 370 result = (*mod_handler) (r); (gdb) perl_header_parser (r=0x81f7384) at mod_perl.c:1013 1013 { (gdb) print &r->per_dir_config $3 = (void **) 0x81f74d8 (gdb) print r->per_dir_config $4 = (void *) 0x0 The site (http://bittorrent.netspace.org/) is on a dual-proc box and the system is Fedora Core 1 with the Perl RPMs from Fedora. The backtrace is the same as Joachim Feise's post linked above. perl -V output is included at the end of this post. apache 1.3.29 and mod_perl 1.29 I had been configuring mod_perl with perl Makefile.PL PREFIX=/pub/p/e/perl \ APACHE_PREFIX=/usr/local/apache-1.3.29 \ APACHE_SRC=../apache_1.3.29/src \ PERL_TRANS=1 PERL_METHOD_HANDLERS=1 PERL_TABLE_API=1 \ PERL_CHILD_INIT=1 PERL_STACKED_HANDLERS=1 PERL_FIXUP=1 DO_HTTPD=1 PREP_HTTPD=1 USE_APACI=1 make and then performing a separate ./configure in ../apache_1.3.29/ ./configure --prefix=/usr/local/apache-1.3.29 \ --enable-shared=max \ --enable-module=headers \ --enable-module=auth_anon \ --enable-module=expires \ --enable-module=rewrite --enable-shared=rewrite \ --enable-module=proxy --enable-shared=proxy \ --activate-module=src/modules/perl/libperl.a \ --enable-module=perl --enable-shared=perl make When doing so, I noticed that while mod_perl compiled with -D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING \ -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE \ -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm \ -I/usr/lib/perl5/5.8.3/i386-linux-thread-multi/CORE Apache was not being compile with similar flags. With the above configuration, Apache would segfault upon receiving a request. (I also noticed the mod_perl was being compile with -fPIC, while Apache modules were being compiled with -fpic. I don't think this makes a different on i386, and just mention it in passing) The following, on the other hand DID compile Apache and mod_perl with appropriately similar flags, and WORKS (no segfault on requests): perl Makefile.PL PREFIX=/pub/p/e/perl APACHE_PREFIX=/usr/local/apache-1.3.29 APACHE_SRC=../apache_1.3.29/src PERL_TRANS=1 PERL_METHOD_HANDLERS=1 PERL_TABLE_API=1 PERL_CHILD_INIT=1 PERL_STACKED_HANDLERS=1 PERL_FIXUP=1 DO_HTTPD=1 USE_DSO=1 USE_APACI=1 APACI_ARGS='--prefix=/usr/local/apache-1.3.29,--enable-shared=max,--enable-module=headers,--enable-module=auth_anon,--enable-module=expires,--enable-module=rewrite,--enable-shared=rewrite,--enable-module=proxy,--enable-shared=proxy' and then building mod_perl and Apache together. I suppose one could compile mod_perl with PREP_HTTPD=1 and configure Apache separately with #CFLAGS_SHLIB="-fPIC -DSHARED_MODULE" \ EXTRA_CFLAGS=`perl -MExtUtils::Embed -e ccflags | sed 's/-D_GNU_SOURCE //'` \ ./configure --prefix=/usr/local/apache-1.3.29 \ --enable-shared=max \ --enable-module=headers \ --enable-module=auth_anon \ --enable-module=expires \ --enable-module=rewrite --enable-shared=rewrite \ --enable-module=proxy --enable-shared=proxy \ --activate-module=src/modules/perl/libperl.a \ --enable-module=perl --enable-shared=perl but I did not test this directly. (removing -D_GNU_SOURCE is necessary to avoid getline() prototype conflicts for the custom getline() function in apache/src/support/{htdigest.c,htpasswd.c,logresolv.c} that conflict with the one in /usr/include/stdio.h when -D_GNU_SOURCE is defined) Apologies for the long post, but this all took many hours for me to figure out, and there seems to be some fatal differences between what happens when compiling mod_perl with PREP_HTTPD=1 or not, and compiling mod_perl and Apache together or separately. Also, I'm compiling a DSO, but not configuring mod_perl with DYNAMIC=1. Are there advantages/disadvantages/requirements for using DYNAMIC=1 when building mod_perl as a DSO? Thanks much. Cheers, Glenn Summary of my perl5 (revision 5.0 version 8 subversion 3) configuration: Platform: osname=linux, osvers=2.4.21-9.elsmp, archname=i386-linux-thread-multi uname='linux bugs.devel.redhat.com 2.4.21-9.elsmp #1 smp thu jan 8 17:08:56 est 2004 i686 i686 i386 gnulinux ' config_args='-des -Doptimize=-O2 -g -pipe -march=i386 -mcpu=i686 -Dversion=5.8.3 -Dmyhostname=localhost [EMAIL PROTECTED] -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -Darchname=i386-linux -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dinc_version_list=5.8.2 5.8.1 5.8.0' hint=recommended, useposix=true, d_sigaction=define usethreads=define use5005threads=undef useithreads=define usemultiplicity=define useperlio=define d_sfio=undef uselargefiles=define usesocks=undef use64bitint=undef use64bitall=undef uselongdouble=undef usemymalloc=n, bincompat5005=undef Compiler: cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm', optimize='-O2 -g -pipe -march=i386 -mcpu=i686', cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBUGGING -fno-strict-aliasing -I/usr/local/include -I/usr/include/gdbm' ccversion='', gccversion='3.3.2 20031218 (Red Hat Linux 3.3.2-5)', gccosandvers='' intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8 alignbytes=4, prototype=define Linker and Libraries: ld='gcc', ldflags =' -L/usr/local/lib' libpth=/usr/local/lib /lib /usr/lib libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc libc=/lib/libc-2.3.2.so, so=so, useshrplib=true, libperl=libperl.so gnulibc_version='2.3.2' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.8.3/i386-linux-thread-multi/CORE' cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib' Characteristics of this binary (from libperl): Compile-time options: DEBUGGING MULTIPLICITY USE_ITHREADS USE_LARGE_FILES PERL_IMPLICIT_CONTEXT Built under linux Compiled at Feb 25 2004 13:30:53 @INC: /usr/lib/perl5/5.8.3/i386-linux-thread-multi /usr/lib/perl5/5.8.3 /usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl/5.8.2 /usr/lib/perl5/site_perl/5.8.1 /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.2/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.1/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.3 /usr/lib/perl5/vendor_perl/5.8.2 /usr/lib/perl5/vendor_perl/5.8.1 /usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl . -- Report problems: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html List etiquette: http://perl.apache.org/maillist/email-etiquette.html