经过1个多月的奋斗与煎熬,终于成功在X86体系结构上交叉编译出了Icedtea(Zero部分)。在编译的过程中,遇到了一些困难,希望能将这些解决方法分享出来,希望对正在纠结的你有一定帮助。也希望和你继续深一步的讨论。
由于LLVM的版本较低,所以不能支持Icedtea(Shark部分),但是交叉编译Zero和Shark的方法大同小异。
在交叉编译前,请仔细阅读icedtea目录下INSTALL文件和configure --help。
笔者采用icedtea6-1.9.1+openjdk-6-src-b20-21_jun_2010的组合进行交叉编译。
编译的一些问题:
由于OpenJDK设计初衷并没有考虑交叉编译,OpenJDK的make脚本会通过检查编译环境自动指定编译环境,我们在Icedtea的configure中配置的工具链环境变量会被修改。我们需要在OpenJDK的make脚本中手动修改。
OpenJDK编译的过程是通过GNU Classpath/GCJ+ECJ(X86) ----> Bootstrap JDK(X86) ----->final JDK(UniCore32)。Icedtea编译过程封装了这一过程,通过make实际上执行了这两个编译步骤,但是由于第二步编译需要使用修改工具链,我们需要通过make icedtea-against-ecj和make icedtea-against-icedtea来分离这两个编译步骤。
在OpenJDK编译过程中,会使用到交叉编译出来的可执行文件(sizer.32和test_gamma),但这显然是行不通的,sizer.32需要在UniCore32体系结构上手动运行,然后拷贝sizes.32到x86上,通过修改这部分的脚本重新实