Right, because you can't even get started without something that "knows" to
call your main class--the jrt0.o, as it were.
Given:
class empty
{
static public void main(String argv[])
{
}
}
(Compiled with gcj
--save-temps --main=empty empty.java.)
You've already used
java.lang.String just so that your main method matches the required signature.
Running it through gcj to produce an executable results in 15 undefined external
references, that will be resolved by the runtine.
Those include
java.lang.Object methods, which can throw exceptions, so now you've got the
exception types, too....
Even the 'main' that gcj synthesizes to invoke the
class calls into the GCJ Java runtime, with JvRunMain.
The assembly for the
above class takes up 457 lines. Most of it is meta-data and bookkeeping;
there's (appropriately) very, very few instructions.
And, of course, in
order to start main(int,char**) we need an instance of the ANSI/ISO C Hosted
Runtime Environment, which is a well-known API. To start up the C Runtime
Environment, the Linux/UNIX convention of calling an assembly routine _start is
used, another API.
APIs are everywhere... 'cause they're just interfaces. [ Reply to This | Parent | # ]
|