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: Static executables


Per Bothner wrote:
Andrzej Bialecki wrote:
Tom Tromey wrote:

"Andrzej" == Andrzej Bialecki <ab@getopt.org> writes:


Andrzej> The question is: is it possible to build static binaries on Linux/BSD,
Andrzej> and if yes, what is the right incantation to do this, for input files
Andrzej> consisting of a mix of *.java, *.jar, and JNI *.o objects? Eg. if I'm
Andrzej> using Fedora Core 4, which sports gcc 4.0.2, whenever I try to pass
Andrzej> the -static flag, the compiler complains that static compilation is
Andrzej> not supported.


Funny, I didn't realize that this error was in there.
I don't remember this decision.

Andrzej> * it's not supported, because it's broken in some well-defined cases

Any code that uses reflection will not work properly.  This is a
problem because parts of the core class library depend on reflection.
For instance, character set translators and locales are loaded this
way.

That may be somewhat misleading. It's not reflection per se that is the problem, but dynamicaly loading classes. I.e. anytime you load a class using Class.forName may fail unless you're sure the class is in the static executable. The static linker can't tell which classed might be loaded using Class.forName.

Ah, that's much better news. I happen to know which classes I'm going to load dynamically in my code, and also in all libraries that I use (I hope I know this ..).



Ugh, that's pretty serious ... Ok, then this means that it's not possible to redistribute binaries to machines where there is no runtime installation. :-( Or at least not as a single file.

Er, no, it's possible. Just tricky. And more-or-less unsupported.


If I were to have the libgcj.a (I don't think it's installed by default), could I pick by hand some of the .o files from it and explictly tell the linker to keep all symbols from those files? Would it work then? Or keep all symbols from the whole libgcj (and tell linker to ignore duplicates), would this work?

Yes, some variation of that can be made to work.

Do I need to compile the libgcj.a from source, or is it distributed as a package (rpm?). If from source, are there any particular options to ./configure I should be aware of?



A simple kludge: In your main file do something like:


  static void dummy () {
    Class myclass1 = mypackage.MyClass1.class;
    ... etc ...
  }

or:
  static final Class myclass1 = mypackage.MyClass1.class;

I don't guarantee that this will actually work - but it is something
that probably *should* work, and shouldn't be very difficult to make
work if it doesn't.

Yep, I get it now, I just need to reference the class explicitly in my code, otherwise linker will skip it. Makes sense.


Thank you for your help!

--
Best regards,
Andrzej Bialecki     <><
___. ___ ___ ___ _ _   __________________________________
[__ || __|__/|__||\/|  Information Retrieval, Semantic Web
___|||__||  \|  ||  |  Embedded Unix, System Integration
http://www.sigram.com  Contact: info at sigram dot com



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