今天看《深入理解JAVA虚拟机》这本书,其中第一章就是讲如何手动编译出一个调试版本的HotSpot虚拟机,禁止优化,并带有符号信息,然后就可以使用GDB来进行调试,方便了解JVM的运作流程。
编译这玩意看似简单,但是因为各种乱七八糟的依赖和奇葩问题倒也花费了我一下午的时间,因此特此记录一下编译的流程。
STEP 1: 获取JDK源码
STEP 2: 配置编译环境
sudo apt-get install build-essential gawk m4 openjdk-7-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev bunutils libmotif3 libmotif-dev ant
STEP 3: 进行编译
设定编译相关的环境变量
#!/bin/bash
export LANG=C
export ALT_BOOTDIR=/usr/lib/jvm/java-7-openjdk-amd64
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
#不编译CORBA,JAXP,JAXWS
export BUILD_CORBA=false
export BUILD_JAXP=false
export BUILD_JAXWS=false
export SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=true
export DEBUG_NAME=debug
export ALLOW_DOWNLOADS=true
export SKIP_COMPARE_IMAGES=true
export ALT_JDK_IMPORT_PATH=/usr/lib/jvm/java-7-openjdk-amd64
BUILD_DEPLOY=false
BUILD_INSTALL=false
export BUILD_DEPLOY BUILD_INSTALL
unset JAVA_HOME
unset CLASSPATH
解决相关编译时遇到的bug
语言设置
把使用语言设置为英文:系统设置----语言支持
time is more than 10 years from present: 1120165200000
由于某个配置文件里的时间距离现在超过10年导致产生了异常(这bug令人无语啊。。。)
解决办法:
vim openjdk/jdk/src/share/classes/java/util/CurrencyData.properties
通过修改CurrencyData.properties文件, 把10年之前的时间修改为10年之内即可
./gamma: relocation error
./gamma: relocation error: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.38.x86_64/jre/lib/amd64/libjava.so: symbol JVM_FindClassFromCaller, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
部分amd64架构的机器可能会出现异常,主要是由于OpenJDK的一个bug导致的
经过查找Stack Overflow上找到了答案:
关于使用OpenJDK 6可能会出现的问题
构造器SslRMIServerSocketFactory(String[],String[],boolean)不适用,这个问题我把Bootstrap JDK换成了OpenJDK 7就解决了,具体原因不详。
编译
make sanity && make
等待漫长的编译时间之后就可以了,通过这个编译,我觉得大项目手动编译还是比较蛋疼的,太依赖于编译环境了。