linux编译openjdk8

最近在看《深入理解java虚拟机》,第一章主要讲java历史,有点意思的是编译openjdk,想自己试着搞搞,但是书上编译的是7,而且要配置一堆的配置文件,就上网查查,openjdk8貌似不用配置这么多,就试着编译8。纪录一下操作过程。

**

编译

**

系统:centOs 7.5 64位(刚开始用的腾讯云1核1g,编译的时候说内存不够,好在腾讯云5天免费退,改成1核2g)
1、下载openjdk8:https://pan.baidu.com/s/1pLSMpAj
2、上传到服务器/usr/openjdk
3、下载的压缩包是7z的,所以要先安装7z工具

yum install p7zip
7za x openjdk-8u40-src-b25-10_feb_2015.7z

然后网上一些7z解压命令 7z x filename会出现7z: command not found错误。
可以参考链接:https://blog.csdn.net/yu_yuan_1314/article/details/11999995

4、安装jdk,编译需要一个引导jdk,网上都说要比openjdk的版本低一个,我也不知道为什么,就依葫芦画瓢,下了1.7u80.

cd /usr/java
tar -zxvf jdk-7u80-linux-x64.tar.gz
vi  /etc/profile
//在打开的文件末尾添加如下内容:
export JAVA_HOME=/usr/java/jdk1.7.0_80
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile    #使配置文件立即生效

5、安装编译用的工具,我安装如下工具之后就可以正常编译了,没有网上说的configure出现未安装的依赖。大家有的话可以再安装缺少的。

yum groupinstall "Development Tools"
yum install libXtst-devel libXt-devel libXrender-devel
yum install cups-devel
yum install freetype-devel
yum install alsa-lib-devel
yum install ccache

6、开始编译

cd /usr/openjdk/openjdk-8u40-src-b25-10_feb_2015/openjdk
bash ./configure --with-target-bits=64 --with-boot-jdk=/usr/java/jdk1.7.0_80/ --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
make all ZIP_DEBUGINFO_FILES=0

其中configure成功会出现如下截图
在这里插入图片描述

此处说明下上面configure用到的参数作用:
–with-target-bits=64 :指定生成64位jdk;
–with-boot-jdk=/usr/java/jdk1.7.0_80/:启动jdk的路径;
–with-debug-level=slowdebug:编译时debug的级别,有release, fastdebug, slowdebug 三种级别;
–enable-debug-symbols ZIP_DEBUGINFO_FILES=0:生成调试的符号信息,并且不压缩;

make成功之后会出现如下截图:但是我没有出现网上说的编译1个多小时的情况
在这里插入图片描述

cd /usr/openjdk/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin 
./java -version
//出现如下截图

在这里插入图片描述

至此,编译工作完成,但是还没有做运行,调试工作。
参考链接:
https://www.linuxidc.com/Linux/2017-06/144713.htm
http://www.voidcn.com/article/p-zkxeqkor-bkg.html
https://blog.csdn.net/hxm_Code/article/details/77417709

运行调试

因为我的linux是云服务器,不太方便调试,想着能不能把编译好的代码放到我的本地windows下运行调试,但是我估计是不行的。猜测理由:1、jdk包含jre,都要分成不同系统下载。2、/usr/openjdk/openjdk-8u40-src-b25-10_feb_2015/openjdk/hotspot/make 这个路径下有不同的操作系统的makefile,以及特定的脚本,应该是按照操作系统来采用不同的配置来生成虚拟机。3、虚拟机是为了屏蔽操作系统的带来的环境不一致,但是在调用native方法的时候还是要适应系统的吧。

20180920更新
可能是我执行的方法不对或者怎么样,总之在windows下执行不起来,其次网上运行调试的文章有些语焉不详,netbeans失败了,还是学着使用gdb吧。

抽时间粗略的学习了一下怎么用gdb。
命令参考链接:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html#cgdb
http://man.linuxde.net/gdb

首先在/usr/openjdk/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin 路径下写一个简单java文件

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

在当前路径下 ./javac Test.java,编译一下文件,这是用openjdk编译出来的jdk来编译java文件
然后执行以下命令

gdb --args ./java Test //设置之后run命令要执行的具体命令,但是我没试出来怎么在run后面加
b /usr/openjdk/openjdk-8u40-src-b25-10_feb_2015/openjdk/jdk/src/share/bin/main.c:95 //在main.c文件的95行打断点
run  //然后会在前面端点处停下来
n //执行下一步

在这里插入图片描述

这样子是不是和平时在ide上debug感觉不一样,可以打命令 layout。下图是不是就感觉好多了。
在这里插入图片描述

然后为什么在main.c上打断点,我看过一些文章是在openjdk/hotspot/src/share/tools/launcher/java.c上打断点,但是openjdk8之后虚拟机入口改变了。

posted @ 2020-08-03 15:53  yaphetsfang  阅读(407)  评论(0编辑  收藏  举报