5

认识HotSpot虚拟机第1篇-在Ubuntu 16.04上编译OpenJDK8的源代码(配视频)

 3 years ago
source link: https://club.perfma.com/article/2395133
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

认识HotSpot虚拟机第1篇-在Ubuntu 16.04上编译OpenJDK8的源代码(配视频)

鸠摩3天前

本文将详细介绍在Ubuntu16.04 LTS上对OpenJDK8进行编译,为了方便大家快速搭建起OpenJDK8的调试开发环境,我还录制了对应的视频放到了B站上,大家可以参考。

视频地址:https://space.bilibili.com/27533329

下面我们开始环境的搭建过程。

1、准备编译环境

使用的操作系统为Ubuntu16.04 LTS(LTS:Long Term Support,长期演进版,Ubuntu会对这一版本的支持时间更长。目前Java也在运用这种方式),如果读者没有安装Ubuntu,可以在Windows上使用虚拟机的方式进行安装,或者可以直接在电脑上安装多系统,这种方式比以虚拟机安装的方式速度要快。Ubuntu操作系统使用的是Linux内核,由于HotSpot是由C++编写的,所以在编译时需要Linux的编译器GCC。

2、下载源代码

OpenJDK使用的代码管理工具为Mercurial(hg),下载并安装Mercurial后就可以通过hg clone命令获取OpenJDK8的源代码了,相关的命令如下:

hg clone http://hg.openjdk.java.net/jdk8/jdk8 openjdk
cd openjdk
bash ./get_source.sh

使用Mercurial下载时速度相对较慢,可以直接去相关网站上下载压缩包,网址为:http://download.java.net/openjdk/jdk8
笔者下载的压缩包为openjdk-8-src-b132-03_mar_2014.zip,使用如下命令对压缩包进行解压:

unzip openjdk-8-src-b132-03_mar_2014.zip

解压后openjdk目录下重要的目录如下表所示。
image.png

3、编译源代码

openjdk中的README-builds.html网页提供了编译源代码的相关说明。在Ubuntu操作系统下编译可以分为两步:

第一步,生成编译配置的脚本

生成编译配置的脚本使用的命令如下:

bash ./configure  \
--with-target-bits=64 \
--with-boot-jdk=/home/mazhi/workspace/jdk1.7.0_72/ \
--with-debug-level=slowdebug \
--enable-debug-symbols ZIP_DEBUGINFO_FILES=0

运行这个命令对编译的openjdk所需要的依赖进行检查,如果终止,可根据对应的提示安装相关的依赖。命令行选项–with-target-bits指定编译64位系统的JDK; 命令行选项–with-boot-jdk指定引导JDK所在目录,以防其他安装的JDK影响。构建JDK8需要使用JDK7 Update 7或更高版本的版本作为引导JDK,但不应使用JDK8作为引导JDK;命令行选项–with-debug-level=slowdebug,有这个选项,可以在GDB等代码调试过程中提供足够的信息;–enable-debug-symbols ZIP_DEBUGINFO_FILES=0生成调试的符号信息,并且不压缩。

在命令运行过程中,可能会提示运行如下的命令安装依赖包:

sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev

这个提示中,有个包的名称错误,我们需要将如上命令中libX11-dev包名改为libx11-dev。

如果命令运行成功,会在当前目录下生成一个目录,目录的名称是根据要编译的目标确定的,如笔者Ubuntu 64位操作系统下生成的目录名为linux-x86_64-normal-server-slowdebug。

第二步,编译

编译使用的命令如下:

make all ZIP_DEBUGINFO_FILES=0   DISABLE_HOTSPOT_OS_VERSION_CHECK=ok

如果命令运行成功,则成功编译出了JDK。运行如下命令:

./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -version

输出的信息如下:

openjdk version "1.8.0-internal-debug"
OpenJDK Runtime Environment (build 1.8.0-internal-debug-mazhi_2019_08_12_20_52-b00)
OpenJDK 64-Bit Server VM (build 25.0-b70-debug, mixed mode)

在openjdk下创建一个Test.java源文件,内容如下:

public class Test{
     public static void main(String[] args){
        System.out.println("Hello World!");
     }
}

通过Javac编译器编译如上的源代码,得到Test.class文件。

运行如上的Class文件,命令如下:

./build/linux-x86_64-normal-server-slowdebug/jdk/bin/javac Test.java
./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test

输出如下的信息:

Hello World!
在编译的时候可能会出现如下3个问题:

(1)OS版本不支持

报错摘要如下:

/home/mazhi/workspace/openjdk8/hotspot/make/linux/Makefile:234: recipe for target 'check_os_version' failed

解决办法:
修改文件 ./hotspot/make/linux/Makefile。修改228行内容:

SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 3% 4%

在执行make命令时最好也添加参数DISABLE_HOTSPOT_OS_VERSION_CHECK=ok。

(2)参数不兼容

错误摘要如下:
recipe for target ‘ad_stuff’ failed
解决办法如下:
修改文件 ./hotspot/make/linux/makefiles/adjust-mflags.sh
删除第67行:

s/-([^][^]*)j/-1-j/

(3)部分Eclipse C++版本无法打断点
更换Eclipse版本

搭建过程中如果有问题可直接评论留言或加作者微信mazhimazh。

作者持续维护的个人博客classloading.com

1人觉得很赞
1011 阅读

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK