步骤和链接 https://blog.csdn.net/qq_34621987/article/details/87872704 类似,不同之处在于
1. 编译Yak而不是OpenJDK,Yak源码链接 链接: https://pan.baidu.com/s/109i34OZwZZqsZv8aKxED6g 密码: cfuz
2. make all时出现错误:
recipe for target 'ad_stuff' failed
make[5]: *** [ad_stuff] Error 2
解决办法:由于make4.x的原因,make时会出现以上错误
修改hotspot/make/linux/makefiles/adjust-mflags.sh文件,加上两个I
echo "$MFLAGS" \
| sed '
s/^-/ -/
- s/ -\([^ ][^ ]*\)j/ -\1 -j/
+ s/ -\([^ I][^ I]*\)j/ -\1 -j/
s/ -j[0-9][0-9]*/ -j/
s/ -j\([^ ]\)/ -j -\1/
s/ -j/ -j'${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}'/
3. 编译完进入bin目录后输入./java -version出现错误
Error: dl failure on line 864 Error: failed /mnt/jdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so, because /mnt/jdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so: undefined symbol: _ZN23G1SATBCardTableModRefBS24write_ref_array_pre_workIP7oopDescEEvPT_i
因为之前去掉了步骤2中adjust-mflags.sh的这一行,导致编译出现错误
s/ -\([^ ][^ ]*\)j/ -\1 -j/
因此按照步骤2中操作进行编译不会出现上述错误
4.
undefine symbols错误
提升一个模板函数定义至头文件,避免出现undefined symbols错误。
# 将 hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp 中的template <class T> void write_ref_array_pre_work(T* dst, int count)方法,提升到对应的
头文件g1SATBCardTableModRefBS.hpp中。
# 模板函数定义需要出现在头文件中,以便编译器为其生成特化版本。若无此修改,运行编译后的java程序,将出现undefine symbols错误。
解决方法:https://www.cnblogs.com/sunilsun/p/6078171.html
zmx@ubuntu:~/nju/yak-openjdk8$ build/linux-x86_64-normal-server-release/jdk/bin/java -version
Error: dl failure on line 864
Error: failed /home/zmx/nju/yak-openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so, because /home/zmx/nju/yak-openjdk8/build/linux-x86_64-normal-server-release/jdk/lib/amd64/server/libjvm.so: undefined symbol: _ZN23G1SATBCardTableModRefBS24write_ref_array_pre_workIP7oopDescEEvPT_i