-findirect-dispatch: broken on Linux, working on Mingw?

Marco Trudel mtrudel@gmx.ch
Fri Mar 9 12:34:00 GMT 2007


Andrew Haley wrote:
> Marco Trudel writes:
>  > Andrew Haley wrote:
>  > > Marco Trudel writes:
>  > >  > Andrew Haley wrote:
>  > >  > > Marco Trudel writes:
>  > >  > >  > Hey all
>  > >  > >  > 
>  > >  > >  > I once started a discussion that ecj1 can't be compiled for a host=Linux 
>  > >  > >  > target=Linux static gcj: http://gcc.gnu.org/ml/java/2007-01/msg00082.html
>  > >  > >  > Back then, no one knew why the error occurred. I think I now stumbled 
>  > >  > >  > over the answer:
>  > >  > >  > 
>  > >  > >  > Having Test.java as a simple "HelloWorld" and working with the compiled 
>  > >  > >  > class:
>  > >  > >  > 
>  > >  > >  > On Linux:
>  > >  > >  > ---------
>  > >  > >  > 
>  > >  > >  > static-gcj-for-lin Test.class --main=Test -findirect-dispatch
>  > >  > >  > -> /tmp/ccq2qpMg.o: In function `main':cc3Fk97a.i:(.text+0x30): 
>  > >  > >  > undefined reference to `JvRunMainName'
>  > >  > >  > collect2: ld returned 1 exit status
>  > >  > >  > 
>  > >  > >  > static-gcj-for-win Test.class --main=Test -findirect-dispatch
>  > >  > >  > -> works
>  > >  > >  > 
>  > >  > > 
>  > >  > > I just can't imagine how indirect dispatch is ever going to work with
>  > >  > > static linking.
>  > >  > 
>  > >  > I don't know what indirect dispatch exactly does.
>  > >  > But I know that it perfectly works with gcc 4.2. So it looks to me
>  > >  > like it's a regression.
>  > > 
>  > > Indirect dispatch works by postponing all linking until runtime:
>  > > whenever a class is referenced, libgcj searches all the jarfiles and
>  > > shared libraries it knows about to satisfy the reference.  So, no java
>  > > libraries (apart from the dummy libgcj-bc.so) are linked into the
>  > > executable.  With static linking, this will cause problems, because
>  > > the linker can't possibly know what compiled code it needs to link
>  > > into the executable.
>  > 
>  > I usually put all the needed source into the binary, so that won't be a 
>  > problem.
> 
> OK.
> 
>  > > It is possible that this might work by accident, if you just happened
>  > > to include the classes you were going to need.  Or, maybe very careful
>  > > manual linking would allow you to add all the classes you knew you
>  > > were going to need at runtime.  But in that case you might as well
>  > > link without indirect dispatch.
>  > 
>  > I need indirect-dispatch for compiling large applications. They
>  > usually have a couple of jars. These jars then reference a ton of
>  > other jars which are never used, but referenced anyhow. So I either
>  > need them to compile the jars, or ignore the references. If I
>  > search and download the missing jars, they usually too reference a
>  > bunch of other jars and so on...  So I go for ignoring the
>  > references and use indirect-dispatch. Is there a better way to
>  > solve this problem?
> 
> Yes, but you know already.  Indirect dispatch and shared libraries is
> the right answer to this problem.

I prefer compiling my jars into the binary instead of creating a shared 
lib for each jar (or one lib for all jars). Specially because I want to 
do it the same way on Windows as on Linux and on Windows, creating dlls 
is currently broken. Otherwise that would be an option.

>  > Solving all dependencies only needs very much time and creates huge
>  > binaries...
> 
>  > >  > > It certainly isn't designed to, and there are lots of
>  > >  > > good technical reasons for believing it can't.  The linker can't see
>  > >  > > the symbols indirect dispatch uses, so can't find out what objects need
>  > >  > > to be linked into the program.
>  > >  > > 
>  > >  > >  > Any direct ideas? Otherwise I'll add a bugreport.
>  > >  > > 
>  > >  > > Short of fixing Mingw to work properly with shared libraries, no.
>  > >  > 
>  > >  > It works in GCC 4.2 for Linux and Mingw as well as in GCC 4.3 for Mingw. 
>  > >  > So it more looks like Linux should be fixed instead of Mingw broken to 
>  > >  > be consistent ;-)
>  > > 
>  > > The point of indirect dispatch is to be able to upgrade the libraries
>  > > on a box without recompiling any of the applications. or indeed any
>  > > other library.  You can even replace libgcj itself with a new library,
>  > > and the precompiled applications continue to work.
>  > 
>  > So, the missing references make sense. But why did it work in GCJ 4.2?
> 
> Probably because of the libgcj-bc library changes.

Ok...

>  > Maybe it was intentionally but broken in the mean time?
>  > Or maybe the linker changed? I think I updated binutils for 4.3...
>  > 
>  > > However, if you really do want to do this weird thing, this link line
>  > > in install/lib/libgcj.spec might work after a fashion:
>  > > 
>  > > *lib: %{static-libgcj:-non_shared -lgcj -call_shared;:%{s-bc-abi:-lgcj_bc;:-lgcj}} -lm   -lpthread -lrt    -ldl %(libgcc) %(liborig)
>  > 
>  > No, that doesn't fix it.
> 
> I tried it, and it works for me on GNU/Linux.  We need the output
> using "gcj -v" to know why it failed in your case.

Attached:
newLib.txt: Compilation output with your *lib: ... line.
oldLib.txt: Compilation output with the original *lib: ... line.

I should mention that I work on 32bit Windows with a static GCJ rev 
122233. The libgcj.spec is used, I removed the *lib line and got another 
error.


thanks
Marco
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: newLib.txt
URL: <http://gcc.gnu.org/pipermail/java/attachments/20070309/7b6f9792/attachment.txt>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: oldLib.txt
URL: <http://gcc.gnu.org/pipermail/java/attachments/20070309/7b6f9792/attachment-0001.txt>


More information about the Java mailing list