上一篇:线程安全与锁优化
编译OpenJDK
1052 2019-12-10 2020-06-25
前言:这一篇博客是用血换来的。
一、为什么要编译OpenJDK
这里有几个点:
-
为什么要编译JDK?因为编译JDK可能会让我们对Java有更深层次的了解。
-
为什么要编译?因为平常我们使用的JDK都是编译后的,类似于二进制jar包,所以看不到注释和源码,不能进行调试。
-
为什么下载的源代码只有一两百兆,编译后文件却有三四个G?
-
为什么编译需要那么多的第三方包?
对于后面两点附上别人的一些看法:“c++就是这封德行,很多库都是基于模板的,一展开就成倍增长”。
二、构建步骤
1、下载安装包
点击这里下载需要编译版本的Source Code。
2、开始构建
- 先查看README-build.html,这个是一定有的,可以整体构建有个把握。
- 运行bash ./configure --enable-debug --with-target-bits=64 --with-boot-jdk=../../jdk1.7检查,根据提示安装工具包。
- 当bash ./configure没有任何报错时,就可以执行make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK CFLAGS_WARNINGS_ARE_ERRORS=-Wno-all。
- 整体应该是这个样子的
# 构建快速debug版本,bootJDK需要是上一个版本的JDK目录
hk@hk-LPC:/usr/dev/openjdk/openjdk$ bash ./configure --enable-debug --with-target-bits=64 --with-boot-jdk=../../jdk1.7
## 省略其他
====================================================
A new configuration has been successfully created in
/usr/dev/openjdk/openjdk/build/linux-x86_64-normal-server-release
using default settings.
Configuration summary:
* Debug level: release
* HS debug level: product
* JDK variant: normal
* JVM variants: server
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
* Version string: 9-internal+0-adhoc.hk.openjdk (9-internal)
Tools summary:
* Boot JDK: openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-2~deb9u1-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode) (at /usr/lib/jvm/java-8-openjdk-amd64)
* Toolchain: gcc (GNU Compiler Collection)
* C Compiler: Version 6.3.0 (at /usr/bin/gcc)
* C++ Compiler: Version 6.3.0 (at /usr/bin/g++)
Build performance summary:
* Cores to use: 4
* Memory limit: 11909 MB
# 忽略版本检查、忽略编译警告,整个过程耗时应该十多分钟
hk@hk-LPC:/usr/dev/openjdk/openjdk$ make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK CFLAGS_WARNINGS_ARE_ERRORS=-Wno-all
3、可能出现的问题
先定个基调:所有出现的编译问题,都是版本不兼容的问题。
# 问题一
Creating sa.make ... /usr/bin/make: 不适用的选项 -- / /usr/bin/make: 不适用
# 这个问题暂时无解,只能换版本。
# 问题二
error: invalid suffix on literal; C 11 requires a space between literal and...
# 这个问题是gcc版本过高,降低gcc版本或提高jdk版本,别无他法
# 问题三
cpCache.hpp:194:42: error: left operand of shift expression '(-1....
# 这个问题是gcc版本过高,降低gcc版本或提高jdk版本,别无他法
# 问题四
int readdir_r(DIR*, dirent*, dirent**)’ is deprecated -Werror=deprecated-d
# 这个问题是警告被当做错误处理,make时开启CFLAGS_WARNINGS_ARE_ERRORS=-Wno-all即可
解决办法就是换版本,根据实际情况升高或降低JDK/编译器版本,一般来说JDK8是比较好的。
三、修改源代码
1、准备工作
- 先去netbeans官网下载8.0-all版本。
- 再在命令行输入gdb,如果找不到命令就运行sudo apt-get install gdb,这一步很重要。
2、运行
导入C++到netbeans,并修改如下两个地方
# JavaTest是事先编译好的class
# 特定版本/参数请自行带入替换,本文展示的只是建议值
项目->属性->运行->运行命令:"${OUTPUT_PATH}" -cp ~/classes/javatest JavaTest
# 之前需关闭自动构建,这里需要告诉netbeans的构建入口
项目->属性->构建->make->构建结果:build/linux-x86_64-normal-server-fastdebug/jdk/bin/java
# java.c是源代码入口,可以在这里打断点调试
导航->转至文件:java.c
3、再编译
当修改了源代码时,直接运行是显示不出结果的,因为此时还未编译,需要重新make。
# 这次make应该最好在命令行运行,netbeans里面运行会报失败
# 这次make速度应该很快,在15s之内
hk@hk-LPC:/usr/dev/openjdk/openjdk$ make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK CFLAGS_WARNINGS_ARE_ERRORS=-Wno-all
# 如下为我的编译输出(我在java.c中printf了一下)
hk@hk-LPC:/usr/dev/openjdk/openjdk/build/linux-x86_64-normal-server-fastdebug/jdk/bin$ ./java -version
Compiled by hk on 2019-12-10
openjdk version "9-internal"
OpenJDK Runtime Environment (fastdebug build 9-internal+0-adhoc.hk.openjdk)
OpenJDK 64-Bit Server VM (fastdebug build 9-internal+0-adhoc.hk.openjdk, mixed mode)
全文完,希望对有需要的朋友有所帮助。
总访问次数: 526次, 一般般帅 创建于 2019-12-10, 最后更新于 2020-06-25
欢迎关注微信公众号,第一时间掌握最新动态!