gcj
最小的可运行示例
您还可以观察到开源实现,例如gcj
(现已过时)。例如Java文件:
public class Main {
public static void main(String args[]) {
System.out.println("hello world");
}
}
然后编译并运行:
gcj -c Main.java
gcj --main=Main -o Main Main.o
./Main
现在,您可以自由对其进行反编译,并查看其工作原理。
file Main.o
说这是一个精灵文件。
readelf -d Main | grep NEEDED
说它取决于动态库:
0x0000000000000001 (NEEDED) Shared library: [libgcj.so.14]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
因此libgcj.so必须是实现Java功能的位置。
然后可以使用以下命令对其进行反编译:
objdump -Cdr Main.o
并确切了解它是如何实现的。
看起来很像C ++,有很多名称修饰和间接多态函数调用。
我想知道垃圾收集是如何开始的。值得研究一下:https : //stackoverflow.com/questions/7100776/garbage-collection-implementation-in-compiled-languages和其他带有GC的编译语言,如Go。
在Ubuntu 14.04,GCC 4.8.4上测试。
还可以查看https://en.wikipedia.org/wiki/Android_Runtime,它是Android 5及更高版本的骨干,它执行完整的AOT来优化Android应用程序。