Building OpenJDK7 with CentOS7


内容纲要

很久以前,买了一本周志明老师的《深入理解Java虚拟机——JVM高级特性与最佳实践》这本书。人在北京飘荡的几年里也没怎么好好看。

今年的3月份辞职归汉,在入职了新工作后,开始捡起书本充电学习了。

好了,废话少叙,下面开始跟我一起编译OpenJDK7吧。

写在前面

Tips:

  1. $ 开头的行表示该符号后面是需要在终端执行的命令
  2. 开头的行表示shell里的注释行

  3. 笔者使用的系统是 CentOS 7.5 x64,本文仅为笔者安装记录供大家参考之
  4. 行文难免有错误疏漏之处,还望大家指正,邮箱: rtfsc8@rtfsc8.top

基本信息

操作系统信息

版本号

笔者的操作系统信息如下:

$ cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core)

内核版本

$ uname -sr
Linux 3.10.0-862.3.3.el7.x86_64

CPU

$ lscpu | grep -i cpu
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                4
On-line CPU(s) list:   0-3
CPU family:            6
Model name:            Intel(R) Core(TM) i3-2328M CPU @ 2.20GHz
CPU MHz:               2200.000
CPU max MHz:           2200.0000
CPU min MHz:           800.0000
NUMA node0 CPU(s):     0-3

Memory

$ lsmem | grep -i total
Total online memory:       4G
Total offline memory:      0B

物料准备

OpenJDK7 源码下载

OpenJDK官网看这里,进入首页下方"Hack on the JDK itself"版块,由clone a Mercurial repository可以了解OpenJDK知识库术语和命名方案。由左侧目录的Source code下方的Mercurial可进入OpenJDK的代码版本管理系统。
获取OpenJDK源码有两种方式,其中一种是通过Mercurial代码版本管理工具从Repository中直接取得源码。
本文结合书本,使用OpenJDK7进行编译。
第二种方式就是下载官方提供的源码压缩包。因为Sun被Oracle收购,所以网站资源地址有变动,大家在OpenJDK™ Source Releases页面的地址是获取不到包的,通过openjdk-7-fcs-src-b147-27_jun_2011.zip进行下载。

Install Mercurial

# 安装hg工具
$ sudo yum -y install mercurial

# 查看版本
$ hg --version
Mercurial Distributed SCM (version 2.6.2)
(see http://mercurial.selenic.com for more information)

Copyright (C) 2005-2012 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Clone OpenJDK7 Source Code

通过 hg clone 是最直接的方式,从版本管理中看变更轨迹比看Release Note效果更好。但不足之处是速度太慢,笔者就在下载过程中失败了好几次才下载全。

# 创建java专用目录并进入该目录
$ mkdir ~/Downloads/java && cd ~/Downloads/java
# clone OpenJDK7源码
$ hg clone http://hg.openjdk.java.net/jdk7/jdk7 openjdk7
# 以上执行成功后请阅读README和README-builds.html
# 执行以下命令开始下载各模块代码
# 因网络原因可能下载部分失败,请重复执行以下命令直至完全下载成功
$ sh ./get_source.sh
# 完全下载成功后执行以下命令再次更新
$ sh ./make/scripts/hgforest.sh pull -u

执行完以上命令后,目录结构如下:

$ ls -Ghl
total 352K
-rw-rw-r--.  1 rtfsc8 1.5K 7月   3 22:23 ASSEMBLY_EXCEPTION
drwxrwxr-x.  2 rtfsc8    6 7月   5 22:49 build
drwxrwxr-x. 27 rtfsc8 4.0K 7月   7 10:55 build-jdk
drwxrwxr-x. 26 rtfsc8 4.0K 7月   7 10:24 build-jdk-debug
drwxrwxr-x.  6 rtfsc8  168 7月   3 22:24 corba
drwxrwxr-x.  2 rtfsc8  101 7月   4 00:30 drop
-rw-rw-r--.  1 rtfsc8 1.4K 7月   3 22:23 get_source.sh
drwxrwxr-x.  8 rtfsc8  193 7月   5 22:56 hotspot
drwxrwxr-x.  7 rtfsc8 4.0K 7月   3 22:24 jaxp
drwxrwxr-x.  7 rtfsc8 4.0K 7月   3 22:29 jaxws
drwxrwxr-x.  7 rtfsc8  180 7月   3 22:30 jdk
drwxrwxr-x.  7 rtfsc8  180 7月   3 22:24 langtools
-rw-rw-r--.  1 rtfsc8  19K 7月   3 22:23 LICENSE
drwxrwxr-x.  4 rtfsc8 4.0K 7月   3 22:23 make
-rw-rw-r--.  1 rtfsc8  16K 7月   3 22:23 Makefile
-rw-rw-r--.  1 rtfsc8 1.8K 7月   3 22:23 README
-rw-rw-r--.  1 rtfsc8 109K 7月   3 22:23 README-builds.html
drwxrwxr-x.  3 rtfsc8   19 7月   4 21:50 src
drwxrwxr-x.  2 rtfsc8   22 7月   3 22:23 test
-rw-rw-r--.  1 rtfsc8 169K 7月   3 22:23 THIRD_PARTY_README

依赖安装

基本依赖

$ sudo yum-builddep java-1.6.0-openjdk

<span id="oracle-jdk-1.6-install">Oracle JDK 1.6 安装</span>

这里是有一个坑的,为了避免大家踩坑,请提前安装好Oracle JDK 1.6。

# ALT_BOOTDIR 用到的是 OpenJDK 1.6.0 会有此报错, OpenJDK 的bug,需要使用 Oracle JDK
# 见到类似下方的报错了,恭喜童鞋您入坑了
# ./gamma: relocation error: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.41.x86_64/jre/lib/amd64/libjava.so: symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference

下载传送门可能需要登陆Oracle,没有帐号的童鞋请注册一下。笔者下载安装的是jdk-6u38-linux-x64-rpm.bin。
如果上一个传送门失效,请继续传送!找到此页面上的Java SE 6进入传送哦~如果这个传送也失效了(T_T),那接着传送,拉到页面最下方,找到Java Archive栏,点击右侧DOWNLOAD按钮自行传送。再不行就只能找baidu了~~~

# 对下载到的bin动动手脚(不要想多,释放里面的rpm包而已)
$ sh jdk-6u38-linux-x64-rpm.bin
# 查看下得到的rpm包
$ ll *.rpm
# 安装Oracle JDK
$ sudo rpm -ivh jdk-6u38-linux-amd64.rpm
# OK 至此已完成Oracle JDK安装
# 查找安装的Oracle JDK目录
# 查找jdk安装名称
$ rpm -qa | grep ^jdk-1.6.0
jdk-1.6.0_38-fcs.x86_64
# 根据安装名称查找安装到本地的文件列表
$ rpm -ql jdk-1.6.0_38-fcs.x86_64
...
/usr/java/jdk1.6.0_38 # Oracle JDK HOME
...
# 以上查找到的目录后面会用到

Dependency Check

# 批量检查依赖包
$ rpm -qa cpio gawk gcc m4 make unzip zip gcc-c++ \
  cups-devel alsa-lib-devel ant libXi-devel \
  freetype libstdc++-static
# 未安装的包则通过yum安装之
# 例如 ant 未安装,则执行以下命令安装
$ sudo yum -y install ant

<span id="source-drops-download">Source Drops Download</span>

# 查看当前所在目录
$ pwd
/home/rtfsc8/Downloads/java/openjdk7
# 创建目录
$ mkdir ~/Downloads/java/openjdk7/drop
# 调转目录
$ cd ~/Downloads/java/openjdk7/drop/
# 下载plug
$ wget http://download.java.net/jaxp/1.4.5/jaxp145_01.zip
$ wget https://netix.dl.sourceforge.net/project/jdk7src/input-archives/jdk7-jaf-2010_08_19.zip
$ wget http://download.java.net/glassfish/components/jax-ws/openjdk/jdk7/jdk7-jaxws2_2_4-b03-2011_05_27.zip
# 回到主编译目录
$ cd ..

准备编译

<span id="set-environment-variables">环境变量设置</span>

# 移除可能存在的openjdk或者其他jdk的影响
unset CLASSPATH
unset JAVA_HOME
export LANG=C \
 ALT_BOOTDIR=/usr/java/jdk1.6.0_38 \
 ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_38 \
 ARCH_DATA_MODEL=64 \
 MILESTONE=Rtfsc8 \
 USE_PRECOMPILED_HEADER=true \
 HOTSPOT_BUILD_JOB=4 \
 ALT_PARALLEL_COMPILE_JOBS=4 \
 SKIP_DEBUG_BUILD=false \
 SKIP_FASTDEBUG_BUILD=true \
 DEBUG_NAME=debug \
 ALT_OUTPUTDIR=~/Downloads/java/openjdk7/build-jdk \
 ALT_DROPS_DIR=~/Downloads/java/openjdk7/drop \
 DISABLE_HOTSPOT_OS_VERSION_CHECK=OK

<span id="make-sanity">配置检查</span>

# 配置检查,出现Sanity check passed.即可进行下一步的编译工作
make sanity

<span id="start-building">开始编译</span>

# 开始编译
make

编译过程中遇到问题请自行解决,解决后执行 make clean 后依次参照如下次序重新编译直至编译成功。
环境变量设置
配置检查
编译

Done

恭喜童鞋~ 当您看到类似以下的输出时,您的jdk已经编译成功了~
Have fun and enjoy it~~~

>>>Making sec-files-win @ 2018年 07月 06日 星期五 00:26:08 CST ...
>>>Making jgss-files @ 2018年 07月 06日 星期五 00:26:08 CST ...
>>>Finished making images @ 2018年 07月 06日 星期五 00:26:08 CST ...
make[2]: Leaving directory `/home/rtfsc8/Downloads/java/openjdk7/jdk/make'
########################################################################
##### Leaving jdk for target(s) sanity all docs images             #####
########################################################################
##### Build time 00:16:13 jdk for target(s) sanity all docs images #####
########################################################################

-- Build times ----------
Target debug_build
Start 2018-07-05 23:53:58
End   2018-07-06 00:26:08
00:03:25 corba
00:09:58 hotspot
00:00:43 jaxp
00:00:49 jaxws
00:16:13 jdk
00:01:02 langtools
00:32:10 TOTAL
-------------------------
make[1]: Leaving directory `/home/rtfsc8/Downloads/java/openjdk7'

写在最后

写得比较啰嗦,大家凑合看~

FAQ

Question List

jaxp/build-defs.xml:70: ERROR: Cannot find source for project jaxp

# 添加变量开关
export ALLOW_DOWNLOADS=true

build/linux-amd64/jaxws/build/xml_generated/build-drop-jaf_src.xml:96: Redirection detected from https to http. Protocol switch unsafe, not allowed.

解决办法

ERROR: echo "*** This OS is not supported:" 'uname -a'; exit 1;

原因是CentOS7相对于OpenJDK7太新了,不在支持的操作系统列表里。

# 添加变量开关
export DISABLE_HOTSPOT_OS_VERSION_CHECK=OK

ERROR: error: "__LEAF" redefined [-Werror]

cd ~/Downloads/java/openjdk7/hotspot
# 打布丁,可以在源代码库搜索相应的问题
# 因为Sun被Oracle收购了,所以网上流传的一些帖子的资源地址不可访问了,建议还是在源代码库去查找
hg patch http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/raw-rev/a6eef545f1a2

ERROR error: converting ‘false’ to pointer type ‘methodOop’ [-Werror=conversion-null]

cd ~/Downloads/java/openjdk7/hotspot
# 打布丁,可以在源代码库搜索相应的问题
# 因为Sun被Oracle收购了,所以网上流传的一些帖子的资源地址不可访问了,建议还是在源代码库去查找
hg patch http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/raw-rev/f457154eee8b

./gamma: relocation error: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.41.x86_64/jre/lib/amd64/libjava.so: symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference

OpenJDK 1.6 的 bug,ALT_BOOTDIR 需要替换为Oracle JDK 1.6

ERROR gcc: error: unrecognized command line option '-mimpure-text'

# 这个-mimpure-text是gcc给Solaris的编译选项,所以以#注释掉该选项即可
# 文件: ./jdk/make/common/shared/Compiler-gcc.gmk
# line: 70

Error: time is more than 10 years from present: 1136059200000

# 修改以下文件,将日期改为十年以内,JDK的Bug。
# File: ./jdk/src/share/classes/java/util/CurrencyData.properties
# line: 108  377  439  529  555

*** No rule to make target /NOT-SET/re/jdk/1.7.0/promoted/latest/binaries/linux-amd64/jre/lib/amd64/server/libjvm.so', needed by /home/rtfsc8/rtfsc8/jvm/java/openjdk7/build-jdk/../build-jdk-debug/lib/amd64/server/libjvm.so’. Stop.

export ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_38

Reference

  1. README-builds.html
  2. OpenJDK™ Source Releases
  3. OpenJDK Repositories
  4. collision between __LEAF define
  5. Don’t return booleans from methods returning pointers Summary: Changed "return false" to "return NULL"
  6. Linux CentOS 6.9 Minimal 编译 OpenJDK 7
  7. ubuntu 13.04环境编译OpenJDK7
  8. 编译OpenJDK(Cannot find source for project jaxp)
  9. ubuntu 13.04环境编译OpenJDK7 *** This OS is not supported
  10. OpenJDK源码阅读导航
  11. 获取OpenJDK源码的两种方式

声明:
  未经特别说明,本站Blog均采用署名-非商业性使用-禁止演绎 2.5 中国大陆授权。任何违反本协议的行为均属于非法行为。如需非商业性转载,请保留署名。如需商业性转载出版,请直接和联系。


《“Building OpenJDK7 with CentOS7”》 有 1 条评论

发表回复

您的电子邮箱地址不会被公开。