[讨论] 只build hotspot如何运行java程序

yuyinyang 2013-10-09

我在openjdk的./hotspot/make路径下进行make,得到一个outputdir,这样在没有完整编译openjdk的情况下能否运行java?如何运行?

我在这个 outputdir/linux_amd64_compiler2/product 路径下找到可执行程序hotspot和gamma launcher,但是运行它们的话似乎会去使用本地机器默认的jre,我的问题是如果把这个outputdir拷到一台没有预装java环境的机器上,有没有办法能让它跑java程序?或者是java running的某一个阶段?

RednaxelaFX 2013-10-09
hotspot/make 的 make target 里有export_*的几个,用那几个target可以自动的跟你输入JDK组合起来输出成一个完整的JDK。

也可以手动的来。在 outputdir/linux_amd64_compiler2/product 下面有libjvm.so,把那个拷贝到一个兼容版本的JDK里替换掉原本的对应文件就可以了。假定你用的JDK的路径在%JDK%,那么放libjvm.so的路径在 %JDK%/jre/lib/amd64/server/ 。另外也最好把 outputdir/linux_amd64_compiler2/generated 下面的sa-jdi.jar拷贝到输出JDK的对应目录,在 %JDK%/lib/
yuyinyang 2013-10-10
您的意思是不是必须把编好的hotspot放到一个现有的jdk中才能工作?如果把这个虚拟机单独放到一个完全没有java环境的体系结构上,有没有可能让它能做一些什么事情呢?
RednaxelaFX 2013-10-10
yuyinyang 写道
您的意思是不是必须把编好的hotspot放到一个现有的jdk中才能工作?

对的。HotSpot VM的本体就是那个libjvm.so,但Java程序需要除JVM之外的一大套东西才可以运行起来,像是java.lang.Object、java.lang.String之类的类都有Java语言实现的部分,而它们在Oracle/OpenJDK里在rt.jar里,这就不是JVM而是JRE的一部分,没它的话Java程序连启动都启动不了。

yuyinyang 写道
如果把这个虚拟机单独放到一个完全没有java环境的体系结构上,有没有可能让它能做一些什么事情呢?

做…做什么事情呢?拿objdump来研究下里面的汇编之类的?
总之不可能用来跑Java程序。

如果您想移植OpenJDK,其实最恶心的不是移植JVM自身,而是移植那庞大的class library。当然移植JVM自身也得花很多功夫,但恐怕跟移植class library要花的功夫比还不是一个量级的。
yuyinyang 2013-10-10
RednaxelaFX 写道
如果您想移植OpenJDK,其实最恶心的不是移植JVM自身,而是移植那庞大的class library。当然移植JVM自身也得花很多功夫,但恐怕跟移植class library要花的功夫比还不是一个量级的。

是的,移植的时候一直遇到诡异的问题。比如我试图交叉编译单独的jdk部分,然后报出下面的错误
make[2]: Entering directory `/home/yuyinyang/openjdk-7u6-fcs-src-b24-28_aug_2012/openjdk/jdk/make/java/java'
(cd  ../nio; make sources)
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
INFO: cross compiling for ARCH amd64, skipping .debuginfo generation.
INFO: no objcopy cmd found so cannot create .debuginfo files.
make[3]: Entering directory `/home/yuyinyang/openjdk-7u6-fcs-src-b24-28_aug_2012/openjdk/jdk/make/java/nio'
make[3]: *** No rule to make target `/classes//sun/nio/ch/SocketOptionRegistry-linux-amd64.java', needed by `/home/yuyinyang/openjdk-7u6-fcs-src-b24-28_aug_2012/openjdk/build/jdk/g
ensrc/sun/nio/ch/SocketOptionRegistry.java'.  Stop.
make[3]: Leaving directory `/home/yuyinyang/openjdk-7u6-fcs-src-b24-28_aug_2012/openjdk/jdk/make/java/nio'
make[2]: *** [niosrc] Error 2
make[2]: Leaving directory `/home/yuyinyang/openjdk-7u6-fcs-src-b24-28_aug_2012/openjdk/jdk/make/java/java'
make[1]: *** [all] Error 1
make[1]: Leaving directory `/home/yuyinyang/openjdk-7u6-fcs-src-b24-28_aug_2012/openjdk/jdk/make/java'
make: *** [all] Error 1

我的目标平台是一个基于x86指令集扩展为64位寻址的体系结构,我把CROSS_COMPILE_ARCH依然设为amd64,原因是如果我把它设成openjdk不能识别的名称在用target compile toolchain编译的时候会默认加上-m32 flag。

我现在想在那个没有java环境的平台上做一些java的事情,就比如说像jikes rvm那样,不关心javac的过程,而只是focus在jvm执行.class文件,这点有可能办到吗?或者您有什么其他的建议吗?不局限于openjdk也行。
RednaxelaFX 2013-10-10
要跑Java程序您无论如何都需要一个class library。Jikes RVM的早期版本也是用GNU Classpath,后来添加对Apache Harmony的兼容,最近也有人在尝试让它支持OpenJDK的class library。我觉得这仨都半斤八两,没哪个真的比别的更容易编译或者移植。

所以抱歉的说我没啥好建议,这是纯苦力活。

JDK在build的时候会接受ARCH_DATA_MODEL参数,这里指定为64就能让最终的编译用-m64而不是-m32了。

您的环境里如果您不cross compile,而是直接为amd64正常编译的话能通过不?
yuyinyang 2013-10-10
RednaxelaFX 写道
您的环境里如果您不cross compile,而是直接为amd64正常编译的话能通过不?

我的host是x86_64的linux环境,是可以通过的,而target platform正如我上面所说,是一个什么都没有的(java环境也没有,编译工具链也没有)十分简化的linux环境,所以只能在host上cross compile。
RednaxelaFX 写道
要跑Java程序您无论如何都需要一个class library。Jikes RVM的早期版本也是用GNU Classpath,后来添加对Apache Harmony的兼容,最近也有人在尝试让它支持OpenJDK的class library。我觉得这仨都半斤八两,没哪个真的比别的更容易编译或者移植。

所以抱歉的说我没啥好建议,这是纯苦力活。

按照您说的如果移植openjdk 的class library,具体是指哪些呢?是说编译过程中build出的.so文件和jar包吗?还是说必须进入jdk/make目录下编一个完整jdk出来?能不能麻烦您给我一些具体一点的指示如何去移植class library啊?苦力活都没关系的,如果能弄出来的话。。
RednaxelaFX 2013-10-10
我自己也没弄过class library的具体移植。Anyway请先从这边开始找资料:http://openjdk.java.net/groups/porters/
yuyinyang 2013-11-08
R大,我自己捣腾了一段时间把openjdk7 cross compile到了我的target平台上,但我拷过去跑的话,一启动java就挂了,出错的地方是:
# Problematic frame:
# v  ~BufferBlob::flush_icache_stub
我想这是不是由于启动的时候首先需要生成一些vm code,而这些代码都是与平台相关的?感觉crash log里的信息不够,还是没有找到问题具体出在哪,能否请R大帮忙看下crash log?多谢。
log url:http://yuyinyang.iteye.com/blog/1973124
LeafInWind 2015-02-02
R大 写道
hotspot/make 的 make target 里有export_*的几个,用那几个target可以自动的跟你输入JDK组合起来输出成一个完整的JDK。


R大能否详细说一下这几个export_*具体是怎么用的啊?
Global site tag (gtag.js) - Google Analytics