深入理解Java虛擬機器之自己編譯JDK

筆架山Code發表於2022-01-09

題外話

最近在閱讀《深入理解Java虛擬機器》,其中有一小節實戰是自己編譯JDK,實際操作下來後遇到問題不少,為此特地記錄,也希望可以給大家帶來一些參考!

前置準備

平臺及工具:Windows 10 + WSL(ubuntu 20.04) + CLion(2021.2.2)

OpenJDK12下載地址:https://hg.openjdk.java.net/jdk/jdk12/

  • 下載安裝解壓即可

編譯工具版本推薦:

  • GCC 7.4及以上

    # Ubuntu上安裝GCC命令,該命令預設安裝9.3版本(2021年)
    sudo apt-get install build-essential
    

編譯依賴庫:

工具 庫名稱 安裝命令
FreeType The FreeType Project sudo apt-get install libfreetype6-dev
CUPS Common UNIX Printing System sudo apt-get install libcups2-dev
X11 X Window System sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
ALSA Advanced Linux Sound Architecture sudo apt-get install libasound2-dev
libffi Portable Foreign Function Interface Library sudo apt-get install libffi-dev
Autoconf Extensible Package of M4 Macros sudo apt-get install autoconf

Bootstrap JDK 準備:

  • OpenJDK11

    sudo apt-get install openjdk-11-jdk
    

開始編譯

編譯FastDebug版,僅含Server模式的HotSpot虛擬機器命令:

bash configure --enable-debug --with-jvm-variants=server

# 嫌寫那麼多麻煩,直接用下面這個?,不過這個是生成release版本的,不利於debug
bash configure

configure命令會進行依賴項檢查,引數配置和構建輸出目錄結構等操作,所以依賴缺失會得到明確提示:

ZIP安裝命令:

sudo apt-get install zip

繼續檢查...繼續安裝缺失的依賴...

成功介面:

依賴檢查通過後,執行make images命令執行整個OpenJDK的編譯,作用是編譯出整個JDK映象

不出所料,編譯報錯:

充分利用了搜尋引擎,以及認真閱讀了building.md檔案後,發現應該是gcc的版本問題,預設安裝的是9,但實際需要的是7,於是把9給解除安裝了,重新安裝了個7

# 解除安裝命令
sudo apt-get remove gcc-9
# 安裝7
sudo apt-get install gcc-7
sudo apt-get install g++-7

# 如果上述命令安裝後,gcc --version能查出版本而不會報錯,就無需使用以下命令
# 或者已有7和9兩個版本,但預設用的是9,也可用以下命令修改為7

# 設定預設選項
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
sudo update-alternatives --config gcc

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
sudo update-alternatives --config g++


萬事俱備只欠東風。先make dist-clean清理一波編譯生成的臨時檔案,接著一波流:

bash configure --enable-debug --with-jvm-variants=server
make images

漫長的等待後...沒有報錯!!!

測試一波:

./build/*/images/jdk/bin/java -version

編譯成功:

目錄結構:

在IDE工具上除錯

匯入JDK原始碼檔案,open file 選擇MakeFile,有彈窗清除clean,然後一直確認即可

等待匯入......

接著會發現幫你生成了一堆的targets,將根目錄Mark Directory as 一下

然後選all即可,開啟編輯,Executable選擇編譯出來的java命令,Before launch移除Build

具體設定各項引數如圖:

找到java.c檔案,打個斷點,直接Debug啟動(開始你的表演):

配置-version只是測試一下是不是真的能夠除錯了而已,如果想要除錯某個Java類呢

IDEA配合Clion遠端除錯

IDEA配置

  • 新增Configuration,選擇Remote JVM Debug即可:

Clion配置

  • 新增Configuration,選擇Custom Build Configuration

  • Target 需要新增一下,

    • make編譯配置

    • make clean配置

  • Executable依然選擇編譯出來的Java命令

  • Program arguments填寫:

    -jar
    -Xdebug
    -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5008
    xxx.jar
    
  • Working directory選擇:上述jar包生成位置

最終配置如圖:

參考資料

《深入理解Java虛擬機器:JVM高階特性與最佳實踐》(第三版)1.6實戰:自己編譯JDK

相關文章