[ATTACHEMENT TO:] BUG REPORT. Loading native-libs dynamically end up with cast-error...

Jeff Sturm jsturm@one-point.com
Thu Nov 28 23:06:00 GMT 2002

On 26 Nov 2002, Anthony Green wrote:
> What I don't understand is that I had to compile _all_ of the code with
> -fpic or -fPIC in order to work -- even Loader.o and bi.o which don't
> end up in a shared library.  The symptom of the failure is a
> ClassNotFound exception.  I modified the test code to print a stack
> trace, but it just hangs instead of printing.
> Does anybody have any insight into this?

>From dlopen(3):

       External references in the library are resolved using  the
       libraries  in that library's dependency list and any other
       libraries previously opened with the RTLD_GLOBAL flag.  If
       the  executable was linked with the flag "-rdynamic", then
       the global symbols in the executable will also be used  to
       resolve references in a dynamically loaded library.

In this case interface bi is undefined in lib-bte.so and defined in the
program executable, so it fails to resolve without -rdynamic:

[jsturm@saturn tmp]$ make
gcj -O2 -c -o Loader.o Loader.java
gcj -O2 -c -o bi.o bi.java
gcj -O2 -c -o bte.o bte.java
gcj -O2 -fPIC -shared -o lib-bte.so bte.o
gcj -O2 -rdynamic --main=Loader -o tes bi.o Loader.o
[jsturm@saturn tmp]$ ./tes

Note this flag is passed to the linker as `--export-dynamic'.


More information about the Java mailing list