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]