编译及调试OpenJDK 8

转自:  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,那么Bootstrap JDK的版本需要为7

依赖安装没有必要复制别人的,你完全可以运行bash ./configure文件,它会提示你哪些依赖没有安装。反复执行几次,直至成功。

如果你是编译OpenJDK 8,那么环境变量部分也可以直接忽略。这种方式是编译之前版本的方式。从OpenJDK 8开始,改为了"configure && make" style build

编译

make all

使用NetBeans调试

打开项目

其实OpenJDK 8里边已经有针对NetBeans生成好的项目文件,我们没有必要像有些文章或者书里边所说的创建新的C++项目然后导入源代码这么麻烦,直接打开即可。

路径在./common/nb_native

打开之后,注意将configuration切换为”Linux_64” 
这里写图片描述

其实我们也可以略过上边的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

具体可以参考:

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

在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即可。

具体可以参考:

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

Running nasgen Exception in thread "main" java.lang.VerifyError: class jdk.nashorn.internal.objects.ScriptFunctionImpl overrides final 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

具体可以参考:

目前尚未搞清楚的问题

如果在高版本上编译,即使将上面遇到的问题一一解决,当运行编译出来的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)

参考

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值