This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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.

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

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

Andrew.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]