Mac编译OpenJdk源码
本文最后更新于:2023-05-12 22:53 星期五
MacOs编译OpenJDK
- 未强调目录,即本地仓库根目录
- 编译Git Tag:jdk-21+21 # 本想编译jdk17,奈何17版本报错太多,无法解决,怀疑是xcode或系统版本问题,索性目前最新。
点击下面按钮跳转相关文档
获取OpenJDK
源码仓库地址1 | |
编译环境
软件环境 (参考官网文档,自行安装。MacOs 推荐使用brew)
macos Ventura 13.3.1 (a)
xcodebuild -version: Xcode 14.3xcode-select -v: xcode-select version 2397./Library/Java/JavaVirtualMachines/jdk-20.jdk/Contents/Homeclang --versionApple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: x86_64-apple-darwin22.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/binclang++ --versionApple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: x86_64-apple-darwin22.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/binautoconf --version: autoconf (GNU Autoconf) 2.71# brew install autoconffreetype-config --ftversion: 2.13.0# brew install freetypemake --version: GNU Make 3.81# brew install makeccache -V: ccache version 4.8# brew install ccache
硬件 :MacBook Pro ; 2.6 GHz 六核Intel Core i7 ; 内存 16 GB 2400 MHz DDR4
编译
configure
1 | |
1 | |
–with-debug-level=slowdebug #可选:release、fastdebug、slowdebug,越靠后debug信息越多,优化越少。
–with-jvm-variants=server #jvm模式:server、client、minimal、core、zero、custom
–with-target-bits=64 #指定编译32位还是64位的JVM
–with-boot-jdk=$JAVA_20_HOME # 系统export 配置的环境变量,我使用的是jdk20
补充
- –with-conf-name=jdk-21+22-slowdebug 自定义名字,执行
make指令,增加CONF=jdk-21+22-slowdebug参数。例如make CONF=jdk-21+22-slowdebug images
1 | |
configure 结果
1 | |
build目录生成如下目录。
1 | |
make
make [Targets][Targets文档]
1 | |
1 | |
导入Clion
compile-commands.json
生成 compile-commands.json ,Compile Commands参考Clion[彩蛋]文档[jetbrains]
1 | |
导入
使用Clion打开目录
./build/macosx-x86_64-server-slowdebug/compile_commands.json文件。使用项目打开,等待Clion完成项目索引扫描
更改项目根目录为OpenJDK根目录,等待重新扫描索引。如下图



配置
配置外部工具

make all#Program 和 Arguments 共同构成了所要执行的命令 “make all”
Name: make
Program: make
Arguments: all
Working directory: {项目的根目录/本地openjdk位置}make clean配置同make allmake images配置 同make allmake配置同make all
运行/调试配置 (Run/Debug configuration)

Run/Debug configuration

编译jdk,修改jdk源码后编译源码使用。

运行Debug
Debug入口
src/java.base/share/native/libjli/java.c第391行
Debug出现 SIGSEGV (signal SIGSEGV)
IDEA 引用 Native OpenJDK
IDEA 新建工程,并修改JDK为编译好的jdk(
build/macosx-x86_64-server-slowdebug/images/),将源码修改为OpenJdk根目录下的src目录。

修改jdk代码

执行 make images 编译jdk
源码更目录执行
make images或在CLion执行预先配置好的make images即可。

运行测试代码看修改效果

异常问题
error: unmappable character (0xE6) for encoding ascii
make/common/JavaCompilation.gmk文件,274行将 ascii 修改为utf-8

Library not loaded: /usr/local/lib/libgvc.6.dylib 错误信息
Library not loaded: /usr/local/lib/libgvc.6.dylib 错误信息
1 | |
解决方式 : 将 graphviz[graphviz官网]的 lib目录下 .dylib 文件映射到 /usr/local/lib/ 目录下
解决方式:执行以下命令即可。
1 | |
寻找到的变相解决方式,反正是意外的解决了make all 报错的问题。
感觉不是最终解决方式,但有没有更好的方式,如看到此贴的人知道,麻烦请告知一下更好的解决方案。📮邮箱 : wangdekunemail@gmail.com
ln -s /usr/local/Cellar/graphviz/8.0.5/lib/libcdt.5.dylib /usr/local/lib/libcdt.5.dylibln -s /usr/local/Cellar/graphviz/8.0.5/lib/libcgraph.6.dylib /usr/local/lib/libcgraph.6.dylibln -s /usr/local/Cellar/graphviz/8.0.5/lib/libgvc.6.dylib /usr/local/lib/libgvc.6.dylibln -s /usr/local/Cellar/graphviz/8.0.5/lib/libgvpr.2.dylib /usr/local/lib/libgvpr.2.dylibln -s /usr/local/Cellar/graphviz/8.0.5/lib/liblab_gamut.1.dylib /usr/local/lib/liblab_gamut.1.dylibln -s /usr/local/Cellar/grahviz/8.0.5/lib/libpathplan.4.dylib /usr/local/lib/libpathplan.4.dylibln -s /usr/local/Cellar/graphviz/8.0.5/lib/libxdot.4.dylib /usr/local/lib/libxdot.4.dylib
lldb报错:SIGSEGV (signal SIGSEGV) (涉及到C/C++相关内容,不明所以,完全是照猫画虎)

解决办法是,在用户家目录创建
.lldbinit,内容如下:
第一种方法[lldbinit1]
1
2# 在compile_commands.json 同级目录添加经过测试无效,需要在系统 `~/.lldbinit`目录下新建,原因未知。
br set -n main -o true -G true -C "pro hand -p true -s false SIGSEGV SIGBUS"第二种方法[lldbinit2]
1
2#main.c是本地绝对路径
breakpoint set --file /Users/../openjdk/src/java.base/share/native/launcher/main.c --line 98 -C "pro hand -p true -s false SIGSEGV SIGBUS" --auto-continue true第三种方法[lldbinit3]
1
break set -n main -C "process handle --pass true --stop false SIGSEGV" -C "process handle --pass true --stop false SIGBUS"
其他
关于在网上看到如下命令
1
2
3bash configure --with-debug-level=slowdebug --with-jvm-variants=server
make CONF=macosx-x86_64-server-slowdebug compile-commands
make CONF=macosx-x86_64-server-slowdebug关于CONF参数的作用,如果build目录下面只有一个配置信息,则可以省略。
参考
- Targets文档:https://hg.openjdk.org/jdk/jdk11/raw-file/tip/doc/building.html#common-make-targets ↩
- jetbrains:https://www.jetbrains.com/help/fleet/generating-a-json-compilation-database.html ↩
- 彩蛋:来源网络的激活工具 https://ffff.ga/ ↩
- graphviz官网:https://graphviz.org/download/#mac ↩
- lldbinit1:https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/ ↩
- lldbinit2:https://www.jianshu.com/p/e7891d25ba6a ↩
- lldbinit3:https://jiawanggjia.github.io/post/openjdk-bian-yi-zhi-nan/ ↩
