"Hello, world!" とだけ表示するプログラムをJavaで書く
$ emacs Hello.java --- Hello.java public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); } } --- $ gcj -c Hello.java
プロパティは空のままで、JvRunMainを呼び出すプログラムを作る。
$ emacs main.c --- main.c extern const char **_Jv_Compiler_Properties; extern void *_ZN5Hello6class$E; static const char *empty[] = { 0 }; int main (int argc, const char **argv) { _Jv_Compiler_Properties = empty; JvRunMain (&_ZN5Hello6class$E, argc, argv); } --- $ gcc -c main.c
リンクする。本来はldだけで行えるのがベストであるが、今回は実験ということで簡略化。
$ gcc -lgcj main.o Hello.o
以下のようになった。
$ ./a.out Hello, world!
正しく表示されていることがわかる。
今回のコンパイル方法は、通常のコンパイル方法といくつか異なる点がある。
$ gcj --main=Hello Hello.o -v Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/specs Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/libgcj.spec rename spec lib to liborig Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux Thread model: posix gcc version 3.3.2 20031022 (Red Hat Linux 3.3.2-1) /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/jvgenmain Hellomain /tmp/cczZxYXe.i /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/cc1 /tmp/cczZxYXe.i -quiet -dumpbase Hellomain.c -g1 -version -fdollars-in-identifiers -o /tmp/cco2D3Uj.s GNU C version 3.3.2 20031022 (Red Hat Linux 3.3.2-1) (i386-redhat-linux) compiled by GNU C version 3.3.2 20031022 (Red Hat Linux 3.3.2-1). GGC heuristics: --param ggc-min-expand=51 --param ggc-min-heapsize=40045 as -V -Qy -o /tmp/cctLTibr.o /tmp/cco2D3Uj.s GNU assembler version 2.14.90.0.6 (i386-redhat-linux) using BFD version 2.14.90.0.6 20030820 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crti.o /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o -L/usr/lib/gcc-lib/i386-redhat-linux/3.3.2 -L/usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../.. /tmp/cctLTibr.o Hello.o -lgcc_s -lgcc -lgcj -lm -lpthread -lz -ldl -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crtn.o
$ gcc -lgcj main.o Hello.o -v Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/specs Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux Thread model: posix gcc version 3.3.2 20031022 (Red Hat Linux 3.3.2-1) /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crt1.o /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crti.o /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtbegin.o -L/usr/lib/gcc-lib/i386-redhat-linux/3.3.2 -L/usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../.. -lgcj main.o Hello.o -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/crtend.o /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/../../../crtn.o
必要ならば後ほど調査することにする。
Copyright (C) 2002-2006 s.arakawa