libjava.so RPATH problem

Tom Schutter tom.schutter at gmail.com
Thu Jun 30 20:58:30 GMT 2005


I am having problems linking in the Java JVM libraries (libjava.so,
libverify.so, libjvm.so) into my executable.

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

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"

At this point ldd tells me:
$ ldd testme
testme:
        libm.so.3 => /lib/libm.so.3 (0x2807c000)
        libjava.so => not found (0x0)
        libverify.so => not found (0x0)
        libjvm.so => not found (0x0)
        libpthread.so.1 => /usr/lib/libpthread.so.1 (0x28097000)
        libc.so.5 => /lib/libc.so.5 (0x280bb000)

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 set
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

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"

At this point ldd tells me:
$ ldd ./testme
./testme:
        libm.so.3 => /lib/libm.so.3 (0x2807c000)
        libjava.so => /usr/local/jdk1.4.2/jre/lib/i386/libjava.so (0x28097000)
        libverify.so => /usr/local/jdk1.4.2/jre/lib/i386/libverify.so
(0x280b5000)
        libjvm.so => /usr/local/jdk1.4.2/jre/lib/i386/server/libjvm.so
(0x280ca000)
        libpthread.so.1 => /usr/lib/libpthread.so.1 (0x28702000)
        libc.so.5 => /lib/libc.so.5 (0x28726000)
        libjvm.so => not found (0x0)
        libverify.so => not found (0x0)
        libjvm.so => not found (0x0)
        libstdc++.so.4 => /usr/lib/libstdc++.so.4 (0x28800000)

Note that at this point on Linux, testme runs ok.

If I set LD_LIBRARY_PATH, the libraries are found (no output is correct):
$ LD_LIBRARY_PATH=/usr/local/jdk1.4.2/jre/lib/i386:/usr/local/jdk1.4.2/jre/lib/i386/server
./testme
$

My questions are:

1) Why is the RPATH in the executable being ignored?

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

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

-- 
Tom Schutter


More information about the freebsd-java mailing list