【笔记】编译JDK源码

前言

用Openjdk11编译Openjdk11

准备工作

  • MacOS操作系统
1
archey
  • clang
1
clang --version
  • clang++
1
clang++ --version
  • autoconf
1
autoconf --version
  • make
1
make --version
  • freetype
1
freetype-config --ftversion
  • mercurial
1
hg --version
  • java
1
java -version

下载源码包

方式一

  • 从代码托管仓库下载
1
hg clone http://hg.openjdk.java.net/jdk/jdk11/

方式二

编译

  • 解压后终端进入到源码包根目录

  • 自动配置

1
sh configure
  • 编译
1
make all

踩坑

  • 报错:(Your Boot JDK version must be one of: 10 11)

原因

  • jdk版本过低

解决问题

  • 更换对应版本的jdk

踩坑

  • 报错:警告: [path] 错误的路径元素 "/usr/local/Cellar/openjdk@11/11.0.8/lib/tools.jar": 没有这种文件或目

原因

  • jdk9以后没有tools.jardt.jar

解决问题

  • jdk8/lib/tools.jarjdk8/lib/dt.jar文件拷贝到jdk11/lib目录下

踩坑

  • 报错:if (old_java_vendor_url_bug != DEFAULT_VENDOR_URL_BUG) {

原因

  • 源码BUG

解决问题

  1. 编辑源码
1
vim src/hotspot/share/runtime/arguments.cpp
  • 搜索if (old_java_vendor
1
/if (old_java_vendor
  • 把判断语句
1
if (strcmp(old_java_vendor_url_bug , DEFAULT_VENDOR_URL_BUG) !=0) {
  • 修改为
1
if (old_java_vendor_url_bug != DEFAULT_VENDOR_URL_BUG) {
  1. 编辑源码
1
vim src/hotspot/share/runtime/sharedRuntime.cpp
  • 搜索buffer.insts()->initialize_shared_locs((relocInfo*)locs两次
1
2
/buffer.insts()->initialize_shared_locs((relocInfo*)locs
/buffer.insts()->initialize_shared_locs((relocInfo*)locs
  • 把语句
1
buffer.insts()->initialize_shared_locs((relocInfo*)locs_buf, sizeof(locs_buf) / sizeof(relocInfo));
  • 修改为
1
buffer.insts()->initialize_shared_locs((relocInfo*)locs_buf, (sizeof(locs_buf)) / (sizeof(relocInfo)));
  1. 编辑源码
1
vim src/java.base/share/native/libfdlibm/e_asin.c
  • 搜索t =
1
/t =
  • 为else添加大括号
1
2
3
4
5
6
7
else {
t = x*x;
p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
w = p/q;
return x+x*w;
}

踩坑

  • 报错:if (colorIndex < (useAppleColor) ? sun_lwawt_macosx_LWCToolkit_NUM_APPLE_COLORS : java_awt_SystemColor_NUM_COLORS) {

原因

  • 源码BUG

解决问题

  • 编辑源码
1
vim src/java.desktop/macosx/native/libawt_lwawt/awt/CSystemColors.m
  • 搜索if (color
1
/if (color
  • 把判断语句
1
if (colorIndex < (useAppleColor) ? sun_lwawt_macosx_LWCToolkit_NUM_APPLE_COLORS : java_awt_SystemColor_NUM_COLORS) {
  • 改为
1
if (colorIndex < ((useAppleColor) ? sun_lwawt_macosx_LWCToolkit_NUM_APPLE_COLORS : java_awt_SystemColor_NUM_COLORS)) {

完成

1
2
cd build/macosx-x86_64-normal-server-release/jdk/bin 
./java -version

  • 以后需要使用自己编译的jdk,只要把build/macosx-x86_64-normal-server-release/images/jdk目录拷贝出来即可
  • 源码为下载的源码

后记

  • 如果修改源码,需要重新编译,重新编译不需要完整编译,只需要增量编译即可
1
make inages

参考文献

哔哩哔哩——CodeSheep
CodingNote.cc的博客
Github——Matthias Baesken
CSDN——武泗海
CSDN——向小凯同学学习