在MacOS Sierra上用clang工具鏈編譯JDK9

??假期得閑,想著最近Java 9已發(fā)布,要不來(lái)編譯一下OpenJDK 9吧笔宿。
??說(shuō)干就干火鼻,首先就是獲取源碼。OpenJDK的源碼使用mercurial管理藻雪,所以沒(méi)有安裝過(guò)mercurial的話需要先安裝mercurial秘噪,使用brew的話,可以直接用brew進(jìn)行安裝勉耀。

brew install mercurial

??安裝完mercurial后就可以獲取源碼了指煎,mercurial的命令是hg。

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

??get_source.sh這個(gè)腳本用于輔助獲取jdk9相關(guān)的所有子項(xiàng)目(包括corba便斥、jdk至壤、jaxp、jaxws椭住、hotspot崇渗、nashorn等)。
??jdk9使用autotools生成Makefile京郑,支持多種工具鏈(如gcc宅广、xlc、clang)些举,由于我自己的開(kāi)發(fā)機(jī)是mac跟狱,所以在此就介紹如何使用clang工具鏈來(lái)進(jìn)行編譯。

cd jdk9
chmod u+x configure
./configure --enable-debug --with-target-bits=64 --with-jvm-variants=server --disable-warnings-as-errors --with-toolchain-type=clang
# --enable-debug 用于開(kāi)啟調(diào)試功能
# --with-target-bits=64 用于指定基于64位進(jìn)行編譯
# --with-jvm-variants=server 用于指定只編譯server版本的jdk
# --disable-warnings-as-errors 是為了編譯通過(guò)不要把警告當(dāng)錯(cuò)誤處理
# --with-toolchain-type=clang 則是指定編譯用的工具鏈為clang

??執(zhí)行以上命令后就會(huì)生成編譯jdk9項(xiàng)目使用的相關(guān)文件(Makefile和make目錄)户魏,此時(shí)執(zhí)行make就可以進(jìn)行編譯了驶臊,但編譯的時(shí)候可能會(huì)遇到一些錯(cuò)誤,我遇到的錯(cuò)誤主要是關(guān)于指針和零值比較的叼丑。我遇到過(guò)3處報(bào)錯(cuò)关翎,可供參考,我的修改方式也較為簡(jiǎn)單鸠信,只是把比較去掉纵寝,直接判斷是否為空指針。

jdk9/hotspot/src/share/vm/opto/lcm.cpp:42:35: error: ordered comparison between pointer and zero ('address' (aka 'unsigned char *') and 'int')
  if (Universe::narrow_oop_base() > 0) { // Implies UseCompressedOops.
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~

jdk9/hotspot/src/share/vm/opto/loopPredicate.cpp:903:73: error: ordered comparison between pointer and zero ('const TypeInt *' and 'int')
      assert(rng->Opcode() == Op_LoadRange || _igvn.type(rng)->is_int() >= 0, "must be");
                                              ~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~

jdk9/hotspot/src/share/vm/memory/virtualspace.cpp:584:14: error: ordered comparison between pointer and zero ('char *' and 'int')
  if (base() > 0) {
      ~~~~~~ ^ ~

??執(zhí)行make命令進(jìn)行編譯星立。

make

??如果順利的話最終會(huì)看到類(lèi)似的輸出爽茴。

Finished building target 'default (exploded-image)' in configuration 'macosx-x86_64-normal-server-fastdebug'

??編譯完后的輸出文件在build目錄下,因?yàn)橹痪幾g了server版本绰垂,所以輸出的目錄是build/macosx-x86_64-normal-server-fastdebug室奏。這個(gè)目錄下的hotspot和jdk就是我們想要的東西了。其中hotspot目錄中含有一個(gè)名為hotspot的腳本劲装,用于輔助調(diào)試jvm胧沫,先嘗試執(zhí)行一下hotspot腳本昌简。

cd hotspot/variant-server/libjvm
bash hotspot

??我得到的是類(lèi)似下面的輸出

Error: missing `/xxx/jvm/jdk9/build/macosx-x86_64-normal-server-fastdebug/hotspot/variant-server/libjvm' JVM at `/xxx/jvm/jdk9/build/macosx-x86_64-normal-server-fastdebug/hotspot/variant-server/libjvm/libjvm.dylib'.

??問(wèn)題也比較明確,缺少了libjvm.dylib這個(gè)文件來(lái)支持jvm的啟動(dòng)琳袄。那就打開(kāi)hotspot腳本來(lái)看一下問(wèn)題出在哪江场。其中有一段這樣的內(nèi)容

REL_MYDIR=`dirname $0`
MYDIR=`cd $REL_MYDIR && pwd`
...
JPARMS="-XXaltjvm=$MYDIR -Dsun.java.launcher.is_altjvm=true"

??缺啥補(bǔ)啥,既然缺libjvm.dylib窖逗,那我們就來(lái)搜一下生成的目錄下有沒(méi)有這個(gè)文件址否,在build/macosx-x86_64-normal-server-fastdebug目錄下進(jìn)行查找。

find . -name 'libjvm.dylib'

??我得到的輸出如下碎紊。

./hotspot/variant-server/libjvm/gtest/libjvm.dylib
./jdk/lib/server/libjvm.dylib
./jdk/lib/server/libjvm.dylib.dSYM/Contents/Resources/DWARF/libjvm.dylib
./support/modules_libs/java.base/server/libjvm.dylib
./support/modules_libs/java.base/server/libjvm.dylib.dSYM/Contents/Resources/DWARF/libjvm.dylib

??最簡(jiǎn)單的方式就是把gtest目錄下的libjvm.dylib復(fù)制到libjvm目錄下(注意:這幾個(gè)libjvm.dylib的功能并不一致佑附,md5校驗(yàn)也不同,此處只是為了讓hotspot腳本運(yùn)行起來(lái))仗考。

cp hotspot/variant-server/libjvm/gtest/libjvm.dylib hotspot/variant-server/libjvm/

??由于之前編譯使用的clang工具鏈音同,所以調(diào)試也就基于lldb進(jìn)行,但原來(lái)的hotspot腳本中并沒(méi)有l(wèi)ldb調(diào)試的相關(guān)內(nèi)容秃嗜,需要進(jìn)行添加权均。修改hotspot腳本

...
# 約在85行左右,此處添加對(duì)lldb參數(shù)對(duì)識(shí)別
case "$1" in
    -gdb)
        MODE=gdb
        shift
        ;;
    -lldb)
        MODE=lldb
        shift
        ;;
    -gud)
        MODE=gud
        shift
        ;;
...
# 約在200行左右锅锨,此處添加lldb的模式
case "$MODE" in
    gdb)
        init_gdb
        $GDB -x $GDBSCR --args $LAUNCHER $JPARMS "$@" $JAVA_ARGS
        rm -f $GDBSCR
        ;;
    lldb)
        lldb -- $LAUNCHER $JPARMS "$@" $JAVA_ARGS
        ;;
    gud)
        init_gdb
...

??為了接下去的調(diào)試方便叽赊,先在當(dāng)前的終端設(shè)置一下新的jdk目錄變量,在build/macosx-x86_64-normal-server-fastdebug目錄下執(zhí)行下面的命令必搞。

FASTDEBUG_HOME=`pwd`
NEW_JDK_HOME=`pwd`/jdk

??創(chuàng)建一個(gè)工作目錄必指,在工作目錄下新建一個(gè)測(cè)試文件Hello.java。

mkdir $FASTDEBUG_HOME/workspace
cd $FASTDEBUG_HOME/workspace

??Hello.java

public class Hello {
    public static void main(String[] args) throws Exception {
        System.out.println("Hello, world!");
    }
}

??編譯Hello.java恕洲。

$NEW_JDK_HOME/bin/javac Hello.java

??使用lldb調(diào)試Hello.class

$FASTDEBUG_HOME/hotspot/variant-server/libjvm/hotspot -lldb -cp . Hello

??這樣就進(jìn)入了lldb的調(diào)試終端塔橡,使用b main打下我們的第一個(gè)斷點(diǎn)。

/xxx/jvm/jdk9/build/macosx-x86_64-normal-server-fastdebug/hotspot/variant-server/libjvm
(lldb) target create "/xxx/jvm/jdk9/build/macosx-x86_64-normal-server-fastdebug/jdk/bin/java"
Current executable set to '/xxx/jvm/jdk9/build/macosx-x86_64-normal-server-fastdebug/jdk/bin/java' (x86_64).
(lldb) settings set -- target.run-args  "-XXaltjvm=/xxx/jvm/jdk9/build/macosx-x86_64-normal-server-fastdebug/hotspot/variant-server/libjvm" "-Dsun.java.launcher.is_altjvm=true" "-cp" "." "Hello"
(lldb) b main
Breakpoint 1: 19 locations.

??然后執(zhí)行run就可以讓jvm跑起來(lái)了霜第,通過(guò)c指令來(lái)讓進(jìn)程繼續(xù)葛家,直到看到輸出"Hello,world!"進(jìn)程退出為止。

Target 0: (java) stopped.
(lldb) c
Process 3500 resuming
Hello, world!
Process 3500 exited with status = 0 (0x00000000)

??至此泌类,jdk9的編譯和簡(jiǎn)單的調(diào)試算是完成了惦银。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市末誓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌书蚪,老刑警劉巖喇澡,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異殊校,居然都是意外死亡晴玖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呕屎,“玉大人让簿,你說(shuō)我怎么就攤上這事⌒憔Γ” “怎么了尔当?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蹂安。 經(jīng)常有香客問(wèn)我椭迎,道長(zhǎng),這世上最難降的妖魔是什么田盈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任畜号,我火速辦了婚禮,結(jié)果婚禮上允瞧,老公的妹妹穿的比我還像新娘简软。我一直安慰自己,他們只是感情好述暂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布痹升。 她就那樣靜靜地躺著,像睡著了一般贸典。 火紅的嫁衣襯著肌膚如雪视卢。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天廊驼,我揣著相機(jī)與錄音据过,去河邊找鬼。 笑死妒挎,一個(gè)胖子當(dāng)著我的面吹牛绳锅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酝掩,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鳞芙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了期虾?” 一聲冷哼從身側(cè)響起原朝,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镶苞,沒(méi)想到半個(gè)月后喳坠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茂蚓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年壕鹉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剃幌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晾浴,死狀恐怖负乡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脊凰,我是刑警寧澤抖棘,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站笙各,受9級(jí)特大地震影響钉答,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杈抢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一数尿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惶楼,春花似錦右蹦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至豹储,卻和暖如春贷盲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剥扣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工巩剖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钠怯。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓佳魔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晦炊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鞠鲜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • 隨著Xcode 5的發(fā)布,LLDB調(diào)試器已經(jīng)取代了GDB断国,成為了Xcode工程中默認(rèn)的調(diào)試器贤姆。它與LLVM編譯器一...
    隨風(fēng)飄蕩的小逗逼閱讀 1,406評(píng)論 0 0
  • 【轉(zhuǎn)載】曾夢(mèng)想仗劍走天涯 1.Xcode IDE概覽 說(shuō)明:從左到右,依次是“導(dǎo)航窗格(Navigator)->邊...
    06a6a973d7ab閱讀 3,839評(píng)論 2 20
  • Xcode 上的lldb LLDB 調(diào)試工具稳衬,gdb替代品庐氮;LLVM : Low Level Virtual Ma...
    helinyu閱讀 929評(píng)論 0 2
  • [轉(zhuǎn)]淺談LLDB調(diào)試器文章來(lái)源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc閱讀 2,517評(píng)論 2 6
  • 1. 為什么會(huì)有腳本橋接 在LLDB中有很多方式可以創(chuàng)建自定義命令。第一種便是command alias宋彼,它為一個(gè)...
    blueshadow閱讀 6,693評(píng)論 2 10