Solaris 10, When trying to run apache: ld.so.1: httpd: fatal relocation error

1

I'm trying to replicate a production box in my lab, I have installed apache and I'm trying to use the configuration copied from the production environment, the results are the following error appearing:

[root@hnm]/usr/local/apache2/bin$./apachectl -k start -f /usr/local/apache2/conf/hdm /httpd.conf httpd: Syntax error on line 939 of /usr/local/apache2/conf/hdm/httpd.conf: Syntax error on line 29 of /usr/local/apache2/conf/hdm/modules.conf: Cannot load /usr/local/apache2/modules /mod_cwmp_22.so into server: ld.so.1: httpd: fatal: relocation error: file /usr/local/apache2 /modules/mod_cwmp_22.so: symbol curl_easy_init: referenced symbol not found

javier

Posted 2013-04-23T15:18:06.003

Reputation: 11

show us this syntax error on line 29 of /usr/local/apache2/conf/hdm/modules.conf – Francisco Tapia – 2015-05-08T14:10:40.823

Answers

2

Lets break down your error message:

Cannot load /usr/local/apache2/modules /mod_cwmp_22.so into server:

Well, obvious.

ld.so.1: httpd: fatal: relocation error:

ld.so.1 is the runtime dynamic loader. When you start an app that is dynamically linked (and on Solaris EVERYthing is dynamically linked) the dynamic loader needs to bring in all the libraries. It also needs to ensure not only does it have all the files, but that it links up all the references, both code and data.

file /usr/local/apache2 /modules/mod_cwmp_22.so: symbol curl_easy_init: referenced symbol not found

Now, here we go. The dynamic loader brought in the cwmp module, which depends on curl (libcurl). It seems to have found libcurl.so (or else you would have seen a different error) but it can not find the specific symbol. That is: it knows the cwmp module needs the function call curl_easy_init, but it can not find it.

My guess, is you have a libcurl version mismatch. The webserver module was built against one version of libcurl, but now you're trying to run against a different version on your dev box.

Id check for versions of libcurl. maybe do a strings -a on libcurl on both dev and prod, make sure they match up. There are other tools like readelf that you can use to verify these, but my big guess is that you can copy the libcurl from prod and place it somewhere in dev where you can see it.

Rich Homolka

Posted 2013-04-23T15:18:06.003

Reputation: 27 121

Hello Rich, First of all thank you for your help, the actual library being used seems to be libcurl.so.4 (since it's the only libcurl on the production server), I copied it and compared it to the libcurl.so.4 by using strings and sending the output to two .txt files respectively and they differ a lot, one is 85kb and the other one 346kb. I still don't know where to go from here, should I check the curl version on the prod server and compare it with the one in my lab? – javier – 2013-04-23T17:39:42.720

Differences between the two of them: [root@hnm]/usr/lib$pvs libcurl.so.4 libldap.so.5 (SUNW_5.1); librt.so.1 (SUNW_1.2); libsocket.so.1 (SUNW_1.4); libnsl.so.1 (SUNW_1.7, SUNWprivate_1.1); libz.so.1 (SUNW_1.1); libc.so.1 (SUNW_1.22, SUNWprivate_1.1); [root@hnm]/usr/lib$pvs /usr/local/libcurl.so.4 libldap.so.5 (SUNW_5.1); libz.so.1 (SUNW_1.1); librt.so.1 (SUNW_1.2); libsocket.so.1 (SUNW_1.4); libnsl.so.1 (SUNW_1.7, SUNWprivate_1.1); libc.so.1 (SUNW_1.22); libgcc_s.so.1 (GCC_3.0); – javier – 2013-04-23T17:56:37.883

So it appears you have /usr/lib/libcurl.so.4 on one machine and /usr/local/libcurl.so.4 on the other. You probably want the same library on both (i.e. from the same source/package, not just in the same path). – alanc – 2013-04-24T03:34:11.883