Обсуждение: 9.2 won't load C-language function

Поиск
Список
Период
Сортировка

9.2 won't load C-language function

От
Craig James
Дата:
I have a C-language function I've been using on 8.4 for a long time.  On 9.2 it won't load:

test=# set search_path = public;
SET
test=# CREATE OR REPLACE FUNCTION chmoogle_session_id() RETURNS integer
AS '/usr/local/pgsql/lib/libchmoogle.so', 'chmoogle_session_id'
LANGUAGE c VOLATILE;
ERROR:  could not load library "/usr/local/pgsql/lib/libchmoogle.so": libopenbabel.so.4: cannot open shared object file: No such file or directory

But libopenbabel.so.4 does exist:

# ls -l /usr/local/pgsql/lib/libopenbabel.so.4
-rwxr-xr-x 1 root root 18250709 2012-10-09 18:05 /usr/local/pgsql/lib/libopenbabel.so.4*

There seems to be some difference in the library search path from 8.4 to 9.2.  For administrative simplicity, I don't use ldconfig, besides which it wasn't needed for 8.4.

What changed in how libraries are loaded between 8.4 and 9.2?

Thanks,
Craig

Re: 9.2 won't load C-language function

От
Tom Lane
Дата:
Craig James <cjames@emolecules.com> writes:
> ERROR:  could not load library "/usr/local/pgsql/lib/libchmoogle.so":
> libopenbabel.so.4: cannot open shared object file: No such file or directory

> But libopenbabel.so.4 does exist:

> # ls -l /usr/local/pgsql/lib/libopenbabel.so.4
> -rwxr-xr-x 1 root root 18250709 2012-10-09 18:05
> /usr/local/pgsql/lib/libopenbabel.so.4*

It may exist, but is it in the dynamic linker's search path?

You didn't say what platform this is, but on Linux you normally have to
negotiate with ldconfig, or else set rpath in the referencing shlib,
if you want to use shlibs that are in nonstandard directories.

> What changed in how libraries are loaded between 8.4 and 9.2?

Nothing, AFAIR.  But you may have dropped an rpath spec when rebuilding
your library, or forgotten about a ldconfig adjustment you made on the
old machine.

            regards, tom lane


Re: 9.2 won't load C-language function

От
Craig Ringer
Дата:
On 10/11/2012 02:22 AM, Craig James wrote:
> I have a C-language function I've been using on 8.4 for a long time.  On
> 9.2 it won't load:
>
> test=# set search_path = public;
> SET
> test=# CREATE OR REPLACE FUNCTION chmoogle_session_id() RETURNS integer
> AS '/usr/local/pgsql/lib/libchmoogle.so', 'chmoogle_session_id'
> LANGUAGE c VOLATILE;
> ERROR:  could not load library "/usr/local/pgsql/lib/libchmoogle.so":
> libopenbabel.so.4: cannot open shared object file: No such file or directory

What does `ldd /usr/local/pgsql/lib/libchmoogle.so` say? What about when
run under the PostgreSQL user account?

You may need to set LD_LIBRARY_PATH in the Pg startup script, or modify
ld.so.conf, or re-build your extension with rpath linking enabled.

As for why it worked with 8.4 - I expect you either altered
LD_LIBRARY_PATH in the 8.4 startup scripts, or maybe the 8.4 version of
the extension was built with -Wl,-rpath so the paths to required
libraries were embedded into the extension library.

--
Craig Ringer


Re: 9.2 won't load C-language function

От
Craig James
Дата:
On Wed, Oct 10, 2012 at 10:08 PM, Craig Ringer <ringerc@ringerc.id.au> wrote:
On 10/11/2012 02:22 AM, Craig James wrote:
I have a C-language function I've been using on 8.4 for a long time.  On
9.2 it won't load:

test=# set search_path = public;
SET
test=# CREATE OR REPLACE FUNCTION chmoogle_session_id() RETURNS integer
AS '/usr/local/pgsql/lib/libchmoogle.so', 'chmoogle_session_id'
LANGUAGE c VOLATILE;
ERROR:  could not load library "/usr/local/pgsql/lib/libchmoogle.so":
libopenbabel.so.4: cannot open shared object file: No such file or directory

What does `ldd /usr/local/pgsql/lib/libchmoogle.so` say? What about when run under the PostgreSQL user account?

Too late ... after reading up on LD_LIBRARY_PATH and why ldconfig is better, I just ran ldconfig on the /usr/local/pgsql/lib and /usr/local/openbabel/lib directories.  Problem fixed.
 
You may need to set LD_LIBRARY_PATH in the Pg startup script, or modify ld.so.conf, or re-build your extension with rpath linking enabled.

As for why it worked with 8.4 - I expect you either altered LD_LIBRARY_PATH in the 8.4 startup scripts, or maybe the 8.4 version of the extension was built with -Wl,-rpath so the paths to required libraries were embedded into the extension library.

It is a bit odd ... 8.4 was working, and I just compiled and installed 9.2 on top of it (and created a fresh database).  Oh well, I guess it will remain a mystery.

Craig James
 

--
Craig Ringer