昨天在看《java虛擬機》的時候,想按照書中的介紹念颈,自己編譯一下openjdk泉粉,沒想到遠比書中描述的異常情況要多,而且在網(wǎng)上還沒能找到解決辦法,只能先放放了嗡靡。不管怎么樣跺撼,把經(jīng)歷記錄在這里,希望有高人幫忙出出解決辦法吧讨彼,先謝謝你們了哈歉井!
編譯環(huán)境1
- BootStrap JDK:sun jdk1.7.0_80
- centos 7
- ant-1.8.0RC1
編譯環(huán)境2
- BootStrap JDK:sun jdk1.7.0_71
- centos 6.5
- ant-1.8.0RC1
編譯過程
以上兩個環(huán)境的錯誤現(xiàn)象其實是一樣的,所以應該和centos的系統(tǒng)版本沒有關系哈误;
坑一
我下載了最新版的ant-1.10.1哩至,結果出現(xiàn)一個網(wǎng)上還沒有人說的一個異常,本著先達成目標的思想蜜自,果斷換到了1.8.0版本菩貌,同樣對應的jdk也從1.8換到了1.7。換了之后報的錯就和網(wǎng)上描述的錯一樣了重荠,往下看箭阶。
坑二
使用make sanity就能發(fā)現(xiàn)的兩個錯誤信息,缺少alsa包和cups包戈鲁,這種倒是是簡單仇参,按照下面的命令進行安裝即可
# 安裝alsa包
sudo yum install alsa-lib-devel
# 安裝cups-devel
sudo yum install cups-devel
# 可以直接安裝libX開頭的包
sudo yum install libX*
坑三
通過make sanity的檢查后,就可以使用一下腳本進行編譯了荞彼,這可是周志明大大出品
#語言選項冈敛,這個必須設置,否則編譯好后會出現(xiàn)一個HashTable的NPE錯
export LANG=C
#Bootstrap JDK的安裝路徑鸣皂。必須設置
#export ALT_BOOTDIR=/usr/java/jdk1.8.0_121
export ALT_BOOTDIR=/home/panyi/jdk1.7.0_80
#允許自動下載依賴
export ALLOW_DOWNLOADS=true
#并行編譯的線程數(shù),設置為和CPU內核數(shù)量一致即可
export HOTSPOT_BUILD_JOBS=8
export ALT_PARALLEL_COMPILE_JOBS=8
#比較本次build出來的映像與先前版本的差異暮蹂。這對我們來說沒有意義寞缝,
#必須設置為false,否則sanity檢查會報缺少先前版本JDK的映像的錯誤提示仰泻。
#如果已經(jīng)設置dev或者DEV_ONLY=true荆陆,這個不顯式設置也行
export SKIP_COMPARE_IMAGES=true
#使用預編譯頭文件,不加這個編譯會更慢一些
export USE_PRECOMPILED_HEADER=true
#要編譯的內容
export BUILD_LANGTOOLS=true
#export BUILD_JAXP=false
#export BUILD_JAXWS=false
#export BUILD_CORBA=false
export BUILD_HOTSPOT=true
export BUILD_JDK=true
#要編譯的版本
#export SKIP_DEBUG_BUILD=false
#export SKIP_FASTDEBUG_BUILD=true
#export DEBUG_NAME=debug
#把它設置為false可以避開javaws和瀏覽器Java插件之類的部分的build
BUILD_DEPLOY=false
#把它設置為false就不會build出安裝包集侯。因為安裝包里有些奇怪的依賴被啼,
#但即便不build出它也已經(jīng)能得到完整的JDK映像,所以還是別build它好了
BUILD_INSTALL=false
#編譯結果所存放的路徑
export ALT_OUTPUTDIR=/home/panyi/openjdk/built/openjdk-7u40
#這兩個環(huán)境變量必須去掉棠枉,不然會有很詭異的事情發(fā)生(我沒有具體查過這些"詭異的
#事情"浓体,Makefile腳本檢查到有這2個變量就會提示警告)
unset JAVA_HOME
unset CLASSPATH
make 2>&1|tee $ALT_OUTPUTDIR/build.log
首先會報錯:/usr/bin/ld: cannot find -lstdc++;(centos6.5上沒有報這個錯)
這個還是缺少庫辈讶,使用命令安裝即可:
sudo yum install libc++
sudo yum install yum install libstdc++-static
這種錯還是簡單明了的命浴,安裝成功了以后,重新執(zhí)行腳本。
坑四
這個就比較坑了生闲,現(xiàn)象如下:
Using java runtime at: /usr/java/jdk1.7.0_76/jre
./gamma: relocation error: /usr/java/jdk1.7.0_76/jre/lib/amd64/libjava.so: symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
make[5]: *** [jvmg] Error 127
我只摘了一點點媳溺,重點是看到這個:./gamma: relocation error
萬能的stackoverflow上面有高人解答,編輯./hotspot/make/linux/Makefile碍讯,去掉所有的test_gamma悬蔽,我看到這個懵逼了,我直接將這個詞替換成功空后捉兴,發(fā)現(xiàn)報命令錯誤了蝎困;繼續(xù)找方法,發(fā)現(xiàn)把這個詞所在的行直接注釋掉才可以轴术。
坑五
Error: time is more than 10 years from present: 1120165200000难衰,這個網(wǎng)上的方法都是可用的,使用命令修改配置文件:vim find -name 'CurrencyData.properties'
逗栽。將所有的年都改成十年以內即可盖袭。
坑六
/usr/bin/gcc -g -O2 -fno-strict-aliasing -fPIC -W -Wall -Wno-unused -Wno-parentheses -pipe -fno-omit-frame-pointer -D_LITTLE_ENDIAN -DNDEBUG -DARCH='"amd64"' -Damd64 -DLINUX -DRELEASE='"1.7.0-internal"' -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -D_REENTRANT -D_LP64=1 -I. -I/home/panyi/openjdk/built/openjdk-7u40/tmp/sun/npt/CClassHeaders -I../../../src/solaris/javavm/export -I../../../src/share/javavm/export -I../../../src/share/npt -I../../../src/solaris/npt -Xlinker -O1 -Xlinker -version-script=mapfile-vers -Wl,--hash-style=both -Xlinker -z -Xlinker origin -Xlinker -rpath -Xlinker \$ORIGIN -Xlinker -z -Xlinker defs -L/home/panyi/openjdk/built/openjdk-7u40/lib/amd64 -Wl,-soname=libnpt.so -shared -o /home/panyi/openjdk/built/openjdk-7u40/lib/amd64/libnpt.so /home/panyi/openjdk/built/openjdk-7u40/tmp/sun/npt/obj64/npt.o /home/panyi/openjdk/built/openjdk-7u40/tmp/sun/npt/obj64/utf.o /home/panyi/openjdk/built/openjdk-7u40/tmp/sun/npt/obj64/utf_md.o -lc
/home/panyi/openjdk/built/openjdk-7u40/tmp/sun/npt/obj64/utf_md.o: In function `iconvConvert':
/home/panyi/openjdk/jdk/make/java/npt/../../../src/solaris/npt/utf_md.c:121: undefined reference to `libiconv'
/home/panyi/openjdk/built/openjdk-7u40/tmp/sun/npt/obj64/utf_md.o: In function `utfTerminate':
/home/panyi/openjdk/jdk/make/java/npt/../../../src/solaris/npt/utf_md.c:83: undefined reference to `libiconv_close'
/home/panyi/openjdk/jdk/make/java/npt/../../../src/solaris/npt/utf_md.c:86: undefined reference to `libiconv_close'
/home/panyi/openjdk/built/openjdk-7u40/tmp/sun/npt/obj64/utf_md.o: In function `utfInitialize':
/home/panyi/openjdk/jdk/make/java/npt/../../../src/solaris/npt/utf_md.c:65: undefined reference to `libiconv_open'
/home/panyi/openjdk/jdk/make/java/npt/../../../src/solaris/npt/utf_md.c:69: undefined reference to `libiconv_open'
collect2: ld returned 1 exit status
make[4]: *** [/home/panyi/openjdk/built/openjdk-7u40/lib/amd64/libnpt.so] Error 1
make[4]: Leaving directory `/home/panyi/openjdk/jdk/make/java/npt'
make[3]: *** [all] Error 1
make[3]: Leaving directory `/home/panyi/openjdk/jdk/make/java'
make[2]: *** [all] Error 1
make[2]: Leaving directory `/home/panyi/openjdk/jdk/make'
make[1]: *** [jdk-build] Error 2
make[1]: Leaving directory `/home/panyi/openjdk'
make: *** [build_product_image] Error 2
終極坑,求高人指點彼宠。還沒有在網(wǎng)上看到有人說編譯openJDK還需要iconv這個組件的鳄虱,也不想再去裝這個組件了,試著在npt的Makefile里面屏蔽iconv相關的命令凭峡,沒有找到有效的方法拙已。。摧冀。倍踪。