Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 6 Jul 2005 08:47:53 +0300
From:      Vasil Dimov <vd@datamax.bg>
To:        Tom Schutter <tom.schutter@gmail.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: linking libjava.so RPATH problem
Message-ID:  <20050706054753.GA69973@sinanica.bg.datamax>
In-Reply-To: <af36cf9705070514554e26356d@mail.gmail.com>
References:  <af36cf9705070514554e26356d@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--8t9RHnE3ZwKMSgU+
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, Jul 05, 2005 at 03:55:26PM -0600, Tom Schutter wrote:
> I am having problems linking in the Java JVM libraries (libjava.so,
> libverify.so, libjvm.so) into my executable.
>=20
> With these options added to my gcc command:
>  -L/usr/local/jdk1.4.2/jre/lib/i386 -ljava -lverify
>  -L/usr/local/jdk1.4.2/jre/lib/i386/server -ljvm
>=20
> It links ok, but when I try to run it I get:
> $ ./testme
> /libexec/ld-elf.so.1: Shared object "libjava.so" not found, required by
> "testme"
>=20
> At this point ldd tells me:
> $ ldd testme
> testme:
>        libm.so.3 =3D3D> /lib/libm.so.3 (0x2807c000)
>        libjava.so =3D3D> not found (0x0)
>        libverify.so =3D3D> not found (0x0)
>        libjvm.so =3D3D> not found (0x0)
>        libpthread.so.1 =3D3D> /usr/lib/libpthread.so.1 (0x28097000)
>        libc.so.5 =3D3D> /lib/libc.so.5 (0x280bb000)
>=20
> Using -Xlinker -rpath -Xlinker PATH_TO_JRE_DIR, I can tell my executable =
to
> look in the JRE dir for libjvm.so.  I have verified that RPATH has been s=
et
> in the executable using objdump:
> $ objdump -x testme | grep RPATH
>  RPATH       /usr/local/jdk1.4.2/jre/lib/i386:/usr/local/jdk1.4.2/jre/lib=
/i386/server
>=20
> But when I run the executable, it cannot find libjvm.so:
> $ ./testme
> /libexec/ld-elf.so.1: Shared object "libjvm.so" not found, required by
> "libjava.so"
>=20
> At this point ldd tells me:
> $ ldd ./testme
> ./testme:
>        libm.so.3 =3D3D> /lib/libm.so.3 (0x2807c000)
>        libjava.so =3D3D> /usr/local/jdk1.4.2/jre/lib/i386/libjava.so (0x2=
8097000)
>        libverify.so =3D3D> /usr/local/jdk1.4.2/jre/lib/i386/libverify.so
> (0x280b5000)
>        libjvm.so =3D3D>
> /usr/local/jdk1.4.2/jre/lib/i386/server/libjvm.so (0x280ca000)
>        libpthread.so.1 =3D3D> /usr/lib/libpthread.so.1 (0x28702000)
>        libc.so.5 =3D3D> /lib/libc.so.5 (0x28726000)
>        libjvm.so =3D3D> not found (0x0)
>        libverify.so =3D3D> not found (0x0)
>        libjvm.so =3D3D> not found (0x0)
>        libstdc++.so.4 =3D3D> /usr/lib/libstdc++.so.4 (0x28800000)
>=20
> Note that at this point on Linux, testme runs ok.
>=20
> If I set LD_LIBRARY_PATH, the libraries are found (no output is correct):
> $ LD_LIBRARY_PATH=3D3D/usr/local/jdk1.4.2/jre/lib/i386:/usr/local/jdk1.4.=
2/jre/lib/i386/server
> ./testme
> $
>=20
> My questions are:
>=20
> 1) Why is the RPATH in the executable being ignored?

Here are my suggestions:

It is not being ignored, as you see: libjava.so, libverify.so and
libjvm.so were found in /usr/local/jdk1.4.2/jre/lib/i386/

> 2) When I add the -rpath, I get two copies of a libjvm.so reference in te=
stme,
>   one that resolves correctly, and one that doesn't.  Why?

What happens is that libjava.so "depends" on libjvm.so and libverify.so
itself:
% ldd /usr/local/jdk1.4.2/jre/lib/i386/libjava.so
/usr/local/jdk1.4.2/jre/lib/i386/libjava.so:
        libjvm.so =3D> not found (0x0)
        libverify.so =3D> not found (0x0)

and libverify.so "depends" on libjvm.so itself:
% ldd /usr/local/jdk1.4.2/jre/lib/i386/libverify.so
/usr/local/jdk1.4.2/jre/lib/i386/libverify.so:
        libjvm.so =3D> not found (0x0)

So, after finding libjava.so, libverify.so and libjvm.so, required by
"testme" executable (thanks to its RPATH) the linker sees that
libjava.so itself depends on libjvm.so and libverify.so and:
1. does not notice that they are already found/loaded
2. does not use the rpath in "testme"
3. starts looking for them in the standard path and does not find them

> 3) What is the correct way of linking in libjvm.so?

In my point of view the libjava.so and libverify.so shared objects are
incorrect in the way that they depend on some shared objects, that are
not located in the standard path *AND* libjava.so and libverify.so do
not have RPATH in themselves.

1. Recompile libjava.so and libverify.so without -L... -l..., it is not
needed anyway.
OR
2. Recompile libjava.so and libverify.so with -L... -l..., but also add
-rpath
OR
3. Use ldconfig -m (see ldconfig_paths in rc.conf(5))
OR
4. Use LD_LIBRARY_PATH

> Thanks,
> --=20
> Tom Schutter

--8t9RHnE3ZwKMSgU+
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----

iD8DBQFCy3CJFw6SP/bBpCARAtyGAJ9K6OFpelWLTpuK0NMC2bu23k7vXwCfb/lK
K+gwOShoPSA0Mh61KH37lx8=
=OEYJ
-----END PGP SIGNATURE-----

--8t9RHnE3ZwKMSgU+--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050706054753.GA69973>