在Ubuntu 16.04上編譯OpenJDK8的源代碼(配視頻)


本文將詳細介紹在Ubuntu16.04 LTS上對OpenJDK8進行編譯,為了方便大家快速搭建起OpenJDK8的調試開發環境,我還錄制了對應的視頻放到了B站上,大家可以參考。

視頻地址:https://space.bilibili.com/27533329

下面我們開始環境的搭建過程。

1、准備編譯環境

使用的操作系統為Ubuntu16.04 LTS(LTS:Long Term Support,長期演進版,Ubuntu會對這一版本的支持時間更長。目前Java也在運用這種方式),如果讀者沒有安裝Ubuntu,可以在Windows上使用虛擬機的方式進行安裝,或者可以直接在電腦上安裝多系統,這種方式比以虛擬機安裝的方式速度要快。Ubuntu操作系統使用的是Linux內核,由於HotSpot是由C++編寫的,所以在編譯時需要Linux的編譯器GCC。

OpenJDK使用的代碼管理工具為Mercurial(hg),下載並安裝Mercurial后就可以通過hg clone命令獲取OpenJDK8的源代碼了,相關的命令如下: 

hg clone http://hg.openjdk.java.net/jdk8/jdk8 openjdk
cd openjdk
bash ./get_source.sh

使用Mercurial下載時速度相對較慢,可以直接去相關網站上下載壓縮包,網址為:http://download.java.net/openjdk/jdk8。筆者下載的壓縮包為openjdk-8-src-b132-03_mar_2014.zip,使用如下命令對壓縮包進行解壓: 

unzip openjdk-8-src-b132-03_mar_2014.zip

解壓后openjdk目錄下重要的目錄如下表所示。

 

openjdk中的README-builds.html網頁提供了編譯源代碼的相關說明。在Ubuntu操作系統下編譯可以分為兩步:

第一步,生成編譯配置的腳本 

生成編譯配置的腳本使用的命令如下: 

bash ./configure  \
--with-target-bits=64 \
--with-boot-jdk=/home/mazhi/workspace/jdk1.7.0_72/ \
--with-debug-level=slowdebug \
--enable-debug-symbols ZIP_DEBUGINFO_FILES=0

運行這個命令對編譯的openjdk所需要的依賴進行檢查,如果終止,可根據對應的提示安裝相關的依賴。命令行選項--with-target-bits指定編譯64位系統的JDK; 命令行選項--with-boot-jdk指定引導JDK所在目錄,以防其他安裝的JDK影響。構建JDK8需要使用JDK7 Update 7或更高版本的版本作為引導JDK,但不應使用JDK8作為引導JDK;命令行選項--with-debug-level=slowdebug,有這個選項,可以在GDB等代碼調試過程中提供足夠的信息;--enable-debug-symbols ZIP_DEBUGINFO_FILES=0生成調試的符號信息,並且不壓縮。

在命令運行過程中,可能會提示運行如下的命令安裝依賴包: 

sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev

這個提示中,有個包的名稱錯誤,我們需要將如上命令中libX11-dev包名改為libx11-dev。  

如果命令運行成功,會在當前目錄下生成一個目錄,目錄的名稱是根據要編譯的目標確定的,如筆者Ubuntu 64位操作系統下生成的目錄名為linux-x86_64-normal-server-slowdebug。

第二步,編譯 

編譯使用的命令如下:

make all ZIP_DEBUGINFO_FILES=0   DISABLE_HOTSPOT_OS_VERSION_CHECK=ok

如果命令運行成功,則成功編譯出了JDK。運行如下命令:  

./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -version

輸出的信息如下:  

openjdk version "1.8.0-internal-debug"
OpenJDK Runtime Environment (build 1.8.0-internal-debug-mazhi_2019_08_12_20_52-b00)
OpenJDK 64-Bit Server VM (build 25.0-b70-debug, mixed mode)

在openjdk下創建一個Test.java源文件,內容如下: 

public class Test{
     public static void main(String[] args){
        System.out.println("Hello World!");
     }
}

通過Javac編譯器編譯如上的源代碼,得到Test.class文件。

運行如上的Class文件,命令如下:

./build/linux-x86_64-normal-server-slowdebug/jdk/bin/javac Test.java
./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test

輸出如下的信息:  

Hello World!

在編譯的時候可能會出現如下2個問題:

(1)OS版本不支持

報錯摘要如下:

/home/mazhi/workspace/openjdk8/hotspot/make/linux/Makefile:234: recipe for target 'check_os_version' failed

解決辦法:

修改文件 ./hotspot/make/linux/Makefile
修改228行內容: SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 為 
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 3% 4%

在執行make命令時最好也添加參數DISABLE_HOTSPOT_OS_VERSION_CHECK=ok。 

(2)參數不兼容

錯誤摘要如下:

recipe for target 'ad_stuff' failed

解決辦法如下:

修改文件 ./hotspot/make/linux/makefiles/adjust-mflags.sh
刪除第67行: s/-([^][^]*)j/-1-j/

搭建過程中如果有問題可直接評論留言或加作者微信mazhimazh。

作者持續維護的個人博客  classloading.com

關注公眾號,有HotSpot源碼剖析系列文章!

    

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM