[讨论] 编译OpenJDK6去用作调试Oracle/Sun jdk1.6.0_45的源码 可以吗?

AnonymMan 2014-11-18
编译OpenJDK6去用作调试Oracle/Sun jdk1.6.0_45的源码 可以吗?

另外OpenJDK和Sun JDK的版本是怎么对应的? 求解。
RednaxelaFX 2014-11-19
AnonymMan 写道
编译OpenJDK6去用作调试Oracle/Sun jdk1.6.0_45的源码 可以吗?

这个问题没看懂。楼主能展开一点说说想做什么事情么?
是要调试Java的部分?C++的部分?C的部分?
是手上有哪边的源码,编译哪边,然后调试哪边?

从字面上理解楼主的问题,似乎是楼主有Oracle JDK6u45的源码但是编译不了,所以想编译并运行OpenJDK6,但是在调试时用Oracle JDK6u45的源码来参考?
<- 这个有点奇怪所以我觉得我理解错了…

AnonymMan 写道
另外OpenJDK和Sun JDK的版本是怎么对应的? 求解。

这是我以前总结的对应表:https://gist.github.com/rednaxelafx/925323
好久没更新了。

OpenJDK6与Sun JDK6其实没有直接的对应关系。历史原因:
http://rednaxelafx.iteye.com/blog/1549577
AnonymMan 2014-11-19
R大,是这样的:我现在在OpenJDK官网下载了OpenJDK6的源码,现在想编译下OpenJDK6的源码,去调试Sun JDK6u45,Sun JDK6u45的源码官方不提供下载了,现在问题就是我不知道编译后的OpenJDK6的源码是否可以去调试Sun JDK的Java部分?
RednaxelaFX 2014-11-19
AnonymMan 写道
R大,是这样的:我现在在OpenJDK官网下载了OpenJDK6的源码,现在想编译下OpenJDK6的源码,去调试Sun JDK6u45,Sun JDK6u45的源码官方不提供下载了,现在问题就是我不知道编译后的OpenJDK6的源码是否可以去调试Sun JDK的Java部分?

OK明白了。您只关心调试Java部分(主要是rt.jar)对不对?

可惜现实是残酷的:不太行。

前面我的回复里我给了一个Sun JDK跟OpenJDK的版本对应表。那个对HotSpot VM的部分有意义,但对JDK的库(Java)部分意义不太大。因为历史原因,OpenJDK6的代码跟Sun JDK6的代码并不同步,所以如果用前者的代码来调试后者的话会时不时遇到行号不对应的情况。
<- 不过如果您愿意在80%的时候都能看到代码而20%的时候虽然行号对不上但大概能猜到在哪里的话,用OpenJDK6的代码来调试也行吧。

与其用OpenJDK6的代码,如果您能试着找到比较早一些的Sun JDK6的代码包的话,那个应该更适用,毕竟后期JDK6的Java部分代码变化相当小。
<- 不过刚才试了下一些老的公开链接都失效了…现在从官网(java.oracle.com / jdk6.java.net)都没指望找到JRL许可证的JDK6代码了。
AnonymMan 2014-11-19
哦,那好吧。从您的帖子中得知sunjdk6u23是oracle发布出来的最后一个JRL协议的版本,现在我去重新编译下sunjdk6u23,用来调试sunjdk6u45中的java部分(rt.jar)应该比用openjdk6的更加准确一点对吧? 还有个问题我在http://stackoverflow.com/questions/18255474/debug-jdk-source-cant-watch-variable-what-it-is 这个帖子中看到想要在eclipse调试时能看到jdk源码中变量的值,需要重新编译一份rt.jar,那么编译完sunjdk6u23后也需要用sunjdk6u23去重新编译一份rt.jar? 还是我直接把编译过的sunjdk6u23-internal-debug去当成我开发用的jdk?
RednaxelaFX 2014-11-20
AnonymMan 写道
哦,那好吧。从您的帖子中得知sunjdk6u23是oracle发布出来的最后一个JRL协议的版本,现在我去重新编译下sunjdk6u23,用来调试sunjdk6u45中的java部分(rt.jar)应该比用openjdk6的更加准确一点对吧?

对的,Oracle JDK6u23比OpenJDK6更接近Oracle JDK6u45。

AnonymMan 写道
还有个问题我在http://stackoverflow.com/questions/18255474/debug-jdk-source-cant-watch-variable-what-it-is 这个帖子中看到想要在eclipse调试时能看到jdk源码中变量的值,需要重新编译一份rt.jar,那么编译完sunjdk6u23后也需要用sunjdk6u23去重新编译一份rt.jar? 还是我直接把编译过的sunjdk6u23-internal-debug去当成我开发用的jdk?

如果您已经找到了JDK6u23的源码而且已经完整编译出了JDK的话(SKIP_DEBUG_BUILD=false),那么您应该能看到build出来了几种不同的image。如果只是要调试Java部分的话,那么从j2sdk-debug-image里面找出rt.jar出来替换掉您现在用的JDK6u45的rt.jar,就可以方便的调试了。

这帖里也讨论过类似的事情:http://hllvm.group.iteye.com/group/topic/25798

还有直接拿JDK自带的src.zip来编译的办法:
http://hllvm.group.iteye.com/group/topic/25839
AnonymMan 2014-11-20
R大,正好我现在在看您的编译oraclejdk6u23的那个帖子,现在我遇到个问题,以下是log:

make[4]: Entering directory `/opt/sunjdk1.6.0_23-6u23-source-code/j2se/make/sun/jdbc'
/usr/bin/gcc -shared -o /opt/sunjdk1.6.0_23-6u23-source-code/control/build/linux-amd64/tmp/sun/sun.jdbc.odbc/JdbcOdbc/libodbcinst.so dummyodbc.c
/usr/bin/ld: /tmp/ccoZD9Ib.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/tmp/ccoZD9Ib.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make[4]: *** [/opt/sunjdk1.6.0_23-6u23-source-code/control/build/linux-amd64/tmp/sun/sun.jdbc.odbc/JdbcOdbc/libodbcinst.so] Error 1
make[4]: Leaving directory `/opt/sunjdk1.6.0_23-6u23-source-code/j2se/make/sun/jdbc'
make[3]: *** [all] Error 1
make[3]: Leaving directory `/opt/sunjdk1.6.0_23-6u23-source-code/j2se/make/sun'
make[2]: *** [all] Error 1
make[2]: Leaving directory `/opt/sunjdk1.6.0_23-6u23-source-code/j2se/make'
make[1]: *** [j2se-build] Error 2
make[1]: Leaving directory `/opt/sunjdk1.6.0_23-6u23-source-code/control/make'
make: *** [dev-build] Error 2

这个是什么情况?
RednaxelaFX 2014-11-20
咦⋯这个ccoZD9Ib.o是啥来的。之前没留意过。
您编译的操作系统是啥版本的?
AnonymMan 2014-11-20
RednaxelaFX 写道
咦⋯这个ccoZD9Ib.o是啥来的。之前没留意过。
您编译的操作系统是啥版本的?



rhel5.4,我在这台机器上已经把openjdk6、7都编译通过了,但是现在编译oraclejdk6u23一直报错。
RednaxelaFX 2014-11-20
AnonymMan 写道
rhel5.4,我在这台机器上已经把openjdk6、7都编译通过了,但是现在编译oraclejdk6u23一直报错。

Hmm⋯我觉得您的需求最好还是别花太多时间精力去解决编译整个JDK的依赖问题。直接用javac来把Java部分的源码编译掉好了。

编译rt.jar里的类对应的Java源码,需要给javac传-XDignore.symbol.file=true参数才行。请参考这帖:http://hllvm.group.iteye.com/group/topic/39947#post-262979
写个Ant脚本就可以把有需要的Java文件全部编译掉了。

jar tf rt.jar

<- 可以看到rt.jar里的类的列表。用这个来创建Ant脚本就好了。
Global site tag (gtag.js) - Google Analytics