linux -- 编译JDK源码

获取JDK源码

环境构建

1 安装相关依赖

1
2
3
4
5
6
#安装aptitude(在处理依赖问题上更佳。aptitude 在删除一个包时,会同时删除本身所依赖的包)
sudo apt-get install aptitude
#更新源信息
sudo aptitude update
#安装编译openjdk8所需依赖
sudo aptitude install build-essential libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfreetype6-dev libasound2-dev ccache

2 下载Bootstrap JDK

一般选择落后一个大版本的JDK作为Bootstrap JDK,这里安装了OpenJDK 7。据说Ubuntu18.04已经去除了openJdk-7的源,所以本次进行了下载后手动安装:

[openjdk-7-jdk](https://packages.debian.org/experimental/openjdk-7-jdk)

[openjdk-7-jre](https://packages.debian.org/experimental/openjdk-7-jre)

[openjdk-7-jre-headless](https://packages.debian.org/experimental/openjdk-7-jre-headless)

[libjpeg62-turbo](https://packages.debian.org/sid/libjpeg62-turbo)

[libfontconfig1](https://packages.debian.org/sid/libfontconfig1)

[fontconfig-config](https://packages.debian.org/sid/fontconfig-config)

下载以上安装包,然后执行命令:

sudo dpkg -i openjdk-7-* libjpeg62-turbo* libfontconfig1* fontconfig-config*

如果在安装过程中报错,则执行以下命令:

sudo apt --fix-broken install

3 切换默认jdk

update-alternatives是Debian系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本,比如系统中同时安装了open jdk和sun jdk两个版本,而我们又希望系统默认使用sun jdk,通过update-alternatives就可以方便实现管理。

通过sudo update-alternatives --config java进行java版本切换

4 安装gcc-4.8g++ 4.8

之前使用apt 默认安装了最新的gcc-7,导致jdk编译中语法大量报错,浪费了大量时间进行改错

第一步:

1
sudo apt-get install gcc-4.8

第二步:设置默认的gcc版本

1
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100

如果用过此方法配置过多个gcc版本,会看到如下选项

1
2
3
4
5
6
7
8
9
10
➜  openjdk update-alternatives --config gcc             
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/gcc-7 50 auto mode
* 1 /usr/bin/gcc-4.8 20 manual mode
2 /usr/bin/gcc-7 50 manual mode

Press <enter> to keep the current choice[*], or type selection number:

按同样的方法配置g++

配置、编译OpenJDK 8

1 配置

1
bash ./configure --with-target-bits=64 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0

一般没什么问题,有的话,按照提示进行fix

2 编译及排错

开始编译

1
make all ZIP_DEBUGINFO_FILES=0

排错

错误1

1
2
3
*** This OS is not supported: Linux ethan 4.4.0-133-generic #159~14.04.1-Ubuntu SMP Fri Aug 10 08:17:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
make[5]: *** [check_os_version] 错误 1
make[4]: *** [linux_amd64_compiler2/debug] 错误 2

解决1

修改文件 ./hotspot/make/linux/Makefile
修改 SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 为
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 3% 4%

错误2

1
2
error: ‘int readdir_r(DIR*, dirent*, dirent**)’ is deprecated [-Werror=deprecated-declarations]
if((status = ::readdir_r(dirp, dbuf, &p)) != 0) {

解决2

修改文件vim hotspot/make/linux/makefiles/gcc.make

1
2
# Compiler warnings are treated as errors
# WARNINGS_ARE_ERRORS = -Werror

3 编译成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## Finished docs (build time 00:02:28)

----- Build times -------
Start 2019-04-15 01:48:49
End 2019-04-15 02:04:07
00:00:30 corba
00:00:24 demos
00:02:28 docs
00:07:24 hotspot
00:00:27 images
00:00:17 jaxp
00:00:26 jaxws
00:03:04 jdk
00:00:01 langtools
00:00:16 nashorn
00:15:18 TOTAL
-------------------------
Finished building OpenJDK for target 'all'

参考资料

mac下编译openjdk1.9及集成clion动态调试

CentOS上编译OpenJDK8源码 以及 在eclipse上调试HotSpot虚拟机源码