stas        2003/11/14 21:42:22

  Modified:    src/docs/2.0/user/troubleshooting troubleshooting.pod
               src/docs/2.0/user Changes.pod
  Log:
  A new troubleshooting section on how to resolve "undefined symbol"
  problems
  Submitted by: Matisse Enzer <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.15      +155 -1    
modperl-docs/src/docs/2.0/user/troubleshooting/troubleshooting.pod
  
  Index: troubleshooting.pod
  ===================================================================
  RCS file: 
/home/cvs/modperl-docs/src/docs/2.0/user/troubleshooting/troubleshooting.pod,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -u -r1.14 -r1.15
  --- troubleshooting.pod       14 Oct 2003 04:09:59 -0000      1.14
  +++ troubleshooting.pod       15 Nov 2003 05:42:21 -0000      1.15
  @@ -169,6 +169,155 @@
   http://httpd.apache.org/docs-2.0/faq/error.html#error.sendfile
   
   
  +=head2 undefined symbol: apr_table_compress
  +
  +After a successful mod_perl build, sometimes during the startup or a
  +runtime you'd get an "undefined symbol: foo" error. The following is
  +one possible scenario to encounter this problem and possible ways to
  +resolve it.
  +
  +Let's say you ran mod_perl's test suite:
  +
  +  % make test
  +
  +and got errors, and you looked in the F<error_log> file
  +(F<t/logs/error_log>) and saw one or more "undefined symbol" errors,
  +e.g.
  +
  +  % undefined symbol: apr_table_compress
  +
  +=over
  +
  +=item Step 1
  +
  +From the source directory (same place you ran "make test") run:
  +
  +  % ldd blib/arch/auto/APR/APR.so | grep apr-
  +
  +META:  ldd is not available on all platforms, e.g. not on Darwin/OS X
  +
  +You you should get a full path, for example:
  +
  +  libapr-0.so.0 => /usr/local/apache2/lib/libapr-0.so.0 (0x40003000)
  +
  +or
  +
  +  libapr-0.so.0 => /some/path/to/apache/lib/libapr-0.so.0 (0x40003000)
  +
  +or something like that. It's that full path to libapr-0.so.0 that you
  +want.
  +
  +
  +=item Step 2
  +
  +Do:
  +
  +  % nm /path/to/your/libapr-0.so.0 | grep table_compress
  +
  +for example:
  +
  +  % nm /usr/local/apache2/lib/libapr-0.so.0 | grep table_compress
  +
  +You should get something like this:
  +
  +  0000d010 T apr_table_compress
  +
  +Note that the "grep table_compress" is only an example, the exact
  +string you are looking for is the name of the "undefined symbol" from
  +the error_log.  So, if you got "undefined symbol: apr_holy_grail" then
  +you would do
  +
  +  % nm /usr/local/apache2/lib/libapr-0.so.0 | grep holy_grail
  +
  +=item Step 3
  +
  +Now, let's see what shared libraries your apache binary has. So, if in
  +step 1 you got F</usr/local/apache2/lib/libapr-0.so.0> then you will
  +do:
  +
  +  % ldd /usr/local/apache2/bin/httpd
  +
  +if in step 1 you got F</foo/bar/apache/lib/libapr-0.so.0> then you do:
  +
  +  % ldd /foo/bar/apache/bin/httpd
  +
  +The output should look something like this:
  +
  +  libssl.so.2 => /lib/libssl.so.2 (0x40023000)
  +  libcrypto.so.2 => /lib/libcrypto.so.2 (0x40054000)
  +  libaprutil-0.so.0 => /usr/local/apache2/lib/libaprutil-0.so.0 (0x40128000)
  +  libgdbm.so.2 => /usr/lib/libgdbm.so.2 (0x4013c000)
  +  libdb-4.0.so => /lib/libdb-4.0.so (0x40143000)
  +  libexpat.so.0 => /usr/lib/libexpat.so.0 (0x401eb000)
  +  libapr-0.so.0 => /usr/local/apache2/lib/libapr-0.so.0 (0x4020b000)
  +  librt.so.1 => /lib/librt.so.1 (0x40228000)
  +  libm.so.6 => /lib/i686/libm.so.6 (0x4023a000)
  +  libcrypt.so.1 => /lib/libcrypt.so.1 (0x4025c000)
  +  libnsl.so.1 => /lib/libnsl.so.1 (0x40289000)
  +  libdl.so.2 => /lib/libdl.so.2 (0x4029f000)
  +  libpthread.so.0 => /lib/i686/libpthread.so.0 (0x402a2000)
  +  libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
  +  /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
  +
  +Those are name =E<gt> value pairs showing the shared libraries used by
  +the C<httpd> binary.
  +
  +Take note of the value for F<libapr-0.so.0> and compare it to what you
  +got in step 1. They should be the same, if not, then mod_perl was
  +compiled pointing to the wrong Apache installation. You should run
  +"make clean" and then
  +
  +  % perl Makefile.pl MP_APACHE_CONFIG=/path/to/apache/bin/apr-config
  +
  +using the correct path for the Apache installation.
  +
  +=item Step 4
  +
  +You should also search for extra copies of F<libapr-0.so.0>. If you
  +find one in I</usr/lib> or I</usr/local/lib> that will explain the
  +problem. Most likely you have an old pre-installed apr package which
  +gets loaded before the copy you found in step 1.
  +
  +On most Linux (and Mac OS X) machines you can do a fast search with:
  +
  +  % locate libapr-0.so.0
  +
  +which searches a database of files on your machine. The "locate"
  +database isn't always up-to-date so a slower, more comprehensive
  +search can be run (as root if possible):
  +
  +  % find / -name "libapr-0.so.0*"
  +
  +or
  +
  +  % find /usr/local -name "libapr-0.so.0*"
  +
  +You might get output like this:
  +
  +  /usr/local/apache2.0.47/lib/libapr-0.so.0.9.4
  +  /usr/local/apache2.0.47/lib/libapr-0.so.0
  +  /usr/local/apache2.0.45/lib/libapr-0.so.0.9.3
  +  /usr/local/apache2.0.45/lib/libapr-0.so.0
  +
  +in which case you would want to make sure that you are configuring and
  +compiling mod_perl with the latest version of apache, for example
  +using the above output, you would do:
  +
  +  % perl Makefile.PL MP_AP_CONFIG=/usr/local/apache2.0.47
  +  % make
  +  % make test
  +
  +
  +=back
  +
  +There could be other causes, but this example shows you how to act
  +when you encounter this problem.
  +
  +
  +
  +
  +
  +
   =head1 Issues with APR Used Outside of mod_perl
   
   It doesn't strictly belong to this document, since it's talking about
  @@ -177,11 +326,16 @@
   
   Whenever using an C<APR::> package outside of mod_perl, you need to:
   
  -    use APR;
  +  use APR;
   
   in order to load the XS subroutines. For example:
   
     % perl -MApache2 -MAPR -MAPR::UUID -le 'print APR::UUID->new->format'
  +
  +
  +
  +
  +
   
   
   =head1 Maintainers
  
  
  
  1.2       +5 -0      modperl-docs/src/docs/2.0/user/Changes.pod
  
  Index: Changes.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/Changes.pod,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -u -r1.1 -r1.2
  --- Changes.pod       20 Mar 2002 17:44:04 -0000      1.1
  +++ Changes.pod       15 Nov 2003 05:42:22 -0000      1.2
  @@ -11,4 +11,9 @@
   
   =head1 ...
   
  +A new troubleshooting section on how to resolve "undefined symbol"
  +problems by Matisse Enzer E<lt>matisse E<lt>atE<gt> hamparts.comE<gt>.
  +
  +
  +
   =cut
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to