设为首页 收藏本站
查看: 1605|回复: 0

[经验分享] 编译及调试OpenJDK 8

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-11-23 06:47:13 | 显示全部楼层 |阅读模式
  转自:  http://blog.csdn.net/pcsxk/article/details/54802148
  


  
IDE:Netbeans 8.2(最新版本即可)

操作系统:Ubuntu 14.04 (内核3.13.0)

make版本:3.81

源代码:OpenJDK 8


编译OpenJDK 8



下载源代码

  
我是直接下载打包好的源代码(使用hg下载还需要再安装hg,这个东西相对来说还是太小众了),地址在这里


环境配置

  
唯一需要注意一点的就是Bootstrap JDK的版本需要低于要编译的JDK的版本。即如果要编译OpenJDK 8,那么BootstrapJDK的版本需要为7。
  
依赖安装没有必要复制别人的,你完全可以运行bash ./configure文件,它会提示你哪些依赖没有安装。反复执行几次,直至成功。
  
如果你是编译OpenJDK 8,那么环境变量部分也可以直接忽略。这种方式是编译之前版本的方式。从OpenJDK 8开始,改为了"configure && make" style build。


编译

  
make all


使用NetBeans调试



打开项目

  
其实OpenJDK 8里边已经有针对NetBeans生成好的项目文件,我们没有必要像有些文章或者书里边所说的创建新的C++项目然后导入源代码这么麻烦,直接打开即可。
  
路径在./common/nb_native
  
打开之后,注意将configuration切换为”Linux_64”

DSC0000.jpg

  其实我们也可以略过上边的make all,用NetBeans打开后直接编译。效果是一样的。



容易遇到的问题

  
文章NetBeans 调试 openjdk8里边提到,需要在构建命令后边加上参数DEBUG_BINARIES=true。经过实际测试发现,加不加这个都不会影响调试,所以可以忽略这个参数。
  
像很多文章中所举的例子,调试Java程序。这时需要选对可以调试的程序,我们需要选取./build/Linux-x86_64-normal-server-release/jdk/bin下的可执行程序,而不是./build/linux-x86_64-normal-server-release/images下的子目录里边的可执行程序。因为后者是release模式编译的,无法触发断点调试。


高版本编译遇到的问题


  我在Ubuntu 14.04中编译时(make版本为3.81),没有遇到问题,一次成功。

但是在Ubuntu 16.04中,遇到了好几个问题,如下。



This OS is not supported: Linux … 4.0.0-1-amd64 …

  
这是OpenJDK中的一个bug。它会在编译时检查Linux的内核版本,之前的检查代码没有检查4.x版本(那个时候还没有这个版本的内核),导致出错。我们只需要在对应的检查代码里加上即可。
  
文件hotspot/make/linux/Makefile

-SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3%
+SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%

  • 1
  • 2


  • 1
  • 2

  
具体可以参考:


  • Debian Bug report logs - #786417 openjdk-8: FTBFS: * This OS is not supported: Linux …4.0.0-1-amd64 …
  • Enable hotspot builds on 4.x Linux kernels


adjust-mflags.sh failed build with GNU Make 4.0 with -I<path containsj>

  
在make 4.x版本中会出现这个问题。
  
修改hotspot/make/linux/makefiles/adjust-mflags.sh文件

@@ -64,7 +64,7 @@
    echo "$MFLAGS" \
    | sed '
        s/^-/ -/
-       s/ -\([^    ][^     ]*\)j/ -\1 -j/
+       s/ -\([^    I][^    I]*\)j/ -\1 -j/
        s/ -j[0-9][0-9]*/ -j/
        s/ -j\([^   ]\)/ -j -\1/
        s/ -j/ -j'${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}'/

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  如果mac(bsd)或者solaris平台上编译,则需要修改对应平台的代码。

路径将上面路径中的linux改为bsd或者solaris即可。

  
具体可以参考:


  • adjust-mflags.sh failed build with GNU Make 4.0 with -I


Running nasgen Exception in thread "main" java.lang.VerifyError

  
Running nasgen Exception in thread "main" java.lang.VerifyError: class jdk.nashorn.internal.objects.ScriptFunctionImpl overridesfinal method setPrototype.(Ljava/lang/Object;)V

解决方法,修改nashorn/make/BuildNashorn.gmk文件,

  $(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/
$(FIXPATH) $(JAVA) \
-  -cp "$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \
+  -Xbootclasspath/p:"$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \
jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D)

  • 1
  • 2
  • 3
  • 4
  • 5


  • 1
  • 2
  • 3
  • 4
  • 5

  
具体可以参考:


  • [Linux-74] 编译jdk中遇到的一些error


目前尚未搞清楚的问题

  
如果在高版本上编译,即使将上面遇到的问题一一解决,当运行编译出来的Java时还是会提示运行失败,错误信息如下:

fimh@ubuntu:~/Dev/openjdk/build/linux-x86_64-normal-server-release/jdk/bin$ ./java -version
Error: dl failure on line 864
Error: failed /home/fimh/Dev/openjdk/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so, because /home/fimh/Dev/openjdk/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so: undefined symbol: _ZN23G1SATBCardTableModRefBS24write_ref_array_pre_workIP7oopDescEEvPT_i

  • 1
  • 2
  • 3


  • 1
  • 2
  • 3

  
看起来是链接错误…

  即使将make版本换为老版本(如3.81)依然是上面的问题

  
所以目前暂时还是使用旧的环境进行编译:


  • Ubuntu 14.04 (非14.04.5,这个版本里边内核已经为4.x)


参考



  • NetBeans 调试 openjdk8
  • 使用Netbeans开发调试OpenJDK中的HotSpot
  • RedHat/CentOS linux 6 环境编译openJDK7
  • Unbuntu_14.04编译openjdk7
  • Ubuntu 14.04.3 64位环境下OpenJDK7编译
  • Ubuntu 下编译OpenJDK,OpenJDk debug,OpenJDk fastdebug
  • 在linux下编译openjdk7
  • Mac编译OpenJDK7(8)和Eclipse调试Hotspot
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
  • adjust-mflags.sh failed build with GNU Make 4.0 with -I
  • [Linux-74] 编译jdk中遇到的一些error
  • Debian Bug report logs - #786417 openjdk-8: FTBFS: * This OS is not supported: Linux …4.0.0-1-amd64 …
  • Enable hotspot builds on 4.x Linux kernels
  • 如何实现make工具的降版本?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-409715-1-1.html 上篇帖子: Docker入门(二):安装/卸载 下篇帖子: 搭建hadoop单机模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表