Ubuntu1.6.4环境下编译openjdk

时间:2021-01-19 15:16:15

1.下载OpenJDK源码

http://www.java.net/download/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip   //我使用的JDK7

2.安装编译所需要的依赖

sudo apt-get install build-essential gawk m4 libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif-common libmotif-dev antsudo apt-get install libx11-devsudo apt-get install libxt-devsudo apt-get install libxext-devsudo apt-get install libxtst-dev

3.安装JDK

下载jdk1.6(http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html)赋予.bin的jdk安装包的执行权限,执行命令:chmod u+x jdk-6u25-linux-x64.bin 执行命令:sudo ./jdk-6u25-linux-x64.bin

4.配置环境变量

终端跳转到OpenJDK源码所在的目录,配置如下环境变量:

#!/bin/bash  #设置语言  export LANG=C  export ALT_BOOTDIR=/home/resound/jdk/jdk1.6.0_45#允许自动下载依赖包  export ALLOW_DOWNLOADS=true  #手工下载的依赖包所在的目录:jaxp145_01.zip、jdk7-jaf-2010_08_19.zip、jdk7-jaxws2_2_4-b03-2011_05_27.zipexport ALT_DROPS_DIR=/home/resound/openjdk/drop#使用预编译头文件,不加这个编译会更慢  export USE_PRECOMPILED_HEADER=true#要编译的内容  export BUILD_LANGTOOLS=true  export BUILD_JAXP=true  export BUILD_JAXWS=true  export BUILD_CORBA=true  export BUILD_HOSTPOT=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出它也已经得到完整的JDK镜像,所以还是不用build它  BUILD_INSTALL=false  #存放编译结果  export ALT_OUTPUTDIR=/home/resound/openjdk/buildunset CLASSPATH  unset JAVA_HOME  make 2>&1 | tee $ALT_OUTPUTDIR/build.log

5.编译OpenJDK源码

make sanity //检查编译,出现Sanity check passed 表示检查通过
make //正式编译 会出现一些错误,后续有我遇到的一些错误和解决方案
 
export JAVA_HOME=/home/resound/openjdk/build/j2sdk-imageexport JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/libexport PATH=.:${JAVA_HOME}/bin:$PATH//配置JAVA_HOME指向编译结果,或将编译结果移动至JAVA_HOME
$ java -version//查看执行结果,编译出来的虚拟机,在-version命令中带有用户的机器名

6.遇到的问题

(1)ERROR: echo "*** This OS is not supported:" 'uname -a'; exit 1;

在我们下载的HotSpot源代码中,默认支持的Linux内核最高版本为2.6,而我们所用的发行版很有可能采用了高于此版本的Linux内核。例如,所用的Ubuntu的内核是3.5(可通过uname -r命令查看自己内核版本)。如果不进行一些调整的话,编译HotSpot时可能会遇到如下报错:

"*** This OS is not supported:" 'uname –a'; exit 1;```如果遇到这个问题,可以在这个文件中找到解决办法:hotspot/make/linux/Makefile。在Makefile文件中,定位到包含字符串“SUPPORTED_OS_VERSION”的代码,并在该行末尾增加“3.5%”,这样就可以使HotSpot支持我们实际使用的内核版本,调整后的代码如下:

SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 3.5%

另一种调整方法是绕过验证操作系统版本的步骤。如清单1-13所示的定位到包含字符串“check_os_version”的代码,将其删除或者注释掉便可。清单1-13来源:hotspot/make/linux/Makefile描述:验证OS版本

check_os_version:

ifeq ($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),)

$(QUIETLY) >&2 echo "* This OS is not supported:" 'uname -a'; exit 1;

endif``

(2)jaxp145_01.zip、jdk7-jaf-2010_08_19.zip、jdk7-jaxws2_2_4-b03-2011_05_27.zip依赖包下载地址变更

mkdir drop

cd drop

curl -L -O http://download.java.net/jaxp/1.4.5/jaxp145_01.zip

curl -L -O http://download.java.net/glassfish/components/jax-ws/openjdk/jdk7/jdk7-jaxws2_2_4-b03-2011_05_27.zip

jaf地址:https://osdn.net/projects/sfnet_jdk7src/downloads/input-archives/jdk7-jaf-2010_08_19.zip/

将jar下载的包放到drop目录下

追加配置环境变量:export ALT_DROPS_DIR=/home/resound/openjdk/drop

(3)error: "__LEAF" redefined [-Werror]

cdefs.h中定义的宏“LEAF”与interfaceSupport.hpp冲突。可以在interfaceSupport.hpp中增加一个“#undef LEAF”语句来解决冲突,具体代码如清单1-14所示。

清单1-14
来源:hotspot/src/share/vm/runtime/interfaceSupport.hpp
描述:预定义宏__LEAF

// LEAF routines do not lock, GC or throw exceptions #ifdef __LEAF #undef __LEAF #define __LEAF(result_type, header) \  TRACE_CALL(result_type, header) \  debug_only(NoHandleMark __hm;) \  /* begin of body */ #endif 

(4)error: converting 'false' to pointer type 'methodOop' [-Werror=conversion-null]

对应的文件的对应方法return false改成return NULL;

(6)Unable to load native library: /home/mengxiansen/program/java/jdk1.7.0_10/jre/lib/amd64/libjava.so: symbol JVM_SetNativeThreadName, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference

出现以上问题,可以尝试使用使用Oracle的jdk6代替jdk7编译openjdk

(7)不识别'-mimpure-text'参数
错误信息:
gcc: error: unrecognized command line option '-mimpure-text'
make[5]: *** [/openjdk/build/linux-amd64/../linux-amd64-debug/lib/amd64/libverify.so] Error 1
解决办法:
gcc版本问题,这个命令在本机所用的4.7.2版的gcc中已经去除,既然不能降低gcc版本(本机ubuntu12.10内核用4.7.2版gcc编译),那

就在 【解压缩目录】/make/common/shared/Compiler-gcc.gmk 中去掉 -mimpure-text 命令

(8)出现Error: time is more than 10 years from present: 1104530400000,把以下文件中的所有时间修改成2010年 
如果没有找到该文件,就全盘搜索 

/jdk/src/share/classes/java/util/CurrencyData.properties

今年是2018年,把小于2008年的都改成2008年之后

(9)undefined reference to 'snd_pcm_*' 

*** [/home/zlh/openjdk/build/linux-amd64/../linux-amd64-fastdebug/lib/amd64/libjsoundalsa.so] Error 1

jdk/make/javax/sound/jsoundalsa/Makefile文件的LDFLAGS += -lasound 改成 OTHER_LDLIBS += -lasound

并在后面追加:EXTRA_LIBS += -lasound 

如果出现其他 "undefined reference to ..."错误可以临时注释掉部分代码