win7x64+cygwin+vs2010编译64位openjdk6

用VS2010编译OpenJDK6,是一个比OpenJDK7更痛苦的过程。

除了OpenJDK7里需要注意的,还有下面几个:
1、编译器版本不同,所以要自行在Makefile中,增加编译器版本
同样的,还有cp一些dll的命令,需要屏蔽

2、命令冲突
主要是sort和echo

3、Windows版本问题,导致部分define失败,以及部分结构体不存在
从而无法编译通过,主要是

jdk/src/windows/native/sun/windows/awtmsg.h
jdk/src/windows/native/sun/windows/awtMMStub.h
jdk/src/windows/native/java/net/NetworkInterface.h

4、jchar*与LPWCHAR之间的CAST失败,主要存在于

jdk/src/windows/native/sun/windows
jdk/src/windows/native/sun/nio/sun
jdk/src/windows/native/sun/java2d/windows
jdk/src/windows/native/sun/awt/splashscreen

5、设置环境变量的命令行:

@set PATH=C:\Windows\system32;

@call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x64
@set VS100COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools

@set ANT_HOME=D:/JavaTools/apache-ant-1.8.1
@set PATH=%PATH%;%ANT_HOME%\bin;

@set FREETYPE_HOME=D:/GnuWin/freetype2.4.10
@set PATH=%PATH%;%FREETYPE_HOME%/bin;
@set ALT_FREETYPE_LIB_PATH=%FREETYPE_HOME%/lib64
@set ALT_FREETYPE_HEADERS_PATH=%FREETYPE_HOME%/include

@set ALT_BOOTDIR=D:/JavaJDK/jdk1.6.0_34
@set ARCH_DATA_MODEL=64
@set ARCH=amd64
@set PLATFORM=windows
@set ALT_DROPS_DIR=D:/DiskF/OpenJDK/openjdk6_VS2010_x64/drops
@set ALT_COMPILER_PATH=C:/Program Files (x86)/Microsoft Visual Studio 10.0/VC/bin/amd64

@set PATH=%PATH%;D:\Cygwin\bin;

@set JAVA_HOME=
@set CLASSPATH=

@color 02
@title OpenJDK6+VS2010+x64

@cmd

win7x64+cygwin+vs2010编译64位openjdk7

建议:
1、这是一个比较折腾的过程,可能的话建议用linux
2、建议用英文系统
3、建议用英文版的vc++
4、请不要用带空格的路径,尤其是不要用带中文的路径,

主要问题有:
1、可执行文件版本不兼容
2、win和linux路径问题
3、字符集问题,鄙视一下corba的注释,根本没考虑其他字符
4、cl的MT和MD要统一
5、不同路径下文件名冲突问题,

准备与编译:
1、安装VS2010、windows sdk7.1、VS2010 sp1,注意sp1和windows sdk的安装顺序
也有说只有VS的Express版本才需要安装windows sdk的,我反正都安装了。
2、安装directx sdk9(Summer 2004)
3、安装cygwin,并按照要求,下载相应组件,
http://www.cygwin.com/
http://hg.openjdk.java.net/jdk7/jdk7/raw-file/tip/README-builds.html
其中make组件太新,需要替换为3.8.1以前的版本
http://www.cmake.org/files/cygwin/make.exe-cygwin1.7
4、下载JDK6u22+,并安装
5、下载ant,并解压
6、下载并编译FreeType2.4
http://sourceforge.net/projects/freetype/files/
x64+MD+Release
7、下载OpenJDK7,并解压
8、新建drops文件夹,下载下面三个文件,并放到dorps文件夹中:
jaxp145_01.zip
jdk7-jaf-2010_08_19.zip
jdk7-jaxws2_2_4-b03-2011_05_27.zip
理论上,ant应该可以自动下载这三个文件,但我这里下不到
手工下载的话,在Makefile里找下面三个关键字就好了:
jaxp_src.bundle.name
jaxws_src.bundle.name
jaf_src.bundle.name

9、准备编译,新建run.bat,按自己的路径进行修改:

rem 这里是为了解决路径冲突问题
@set PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;

rem 注意,这里我的VS和WindowsSDK有冲突,导致VS100COMNTOOLS路径错误
@call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x64
@set VS100COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools

rem ANT配置
@set ANT_HOME=D:/JavaTools/apache-ant-1.8.1
@set PATH=%PATH%;%ANT_HOME%\bin;

rem FreeType配置
@set FREETYPE_HOME=D:/GnuWin/freetype2.4.10
@set PATH=%PATH%;%FREETYPE_HOME%/bin;
@set ALT_FREETYPE_LIB_PATH=%FREETYPE_HOME%/lib64
@set ALT_FREETYPE_HEADERS_PATH=%FREETYPE_HOME%/include

rem Cygwin设置
@set PATH=%PATH%;D:\Cygwin\bin;

rem 这里是OpenJDK的设置啦
@set ALT_BOOTDIR=D:/JavaJDK/jdk1.6.0_34
@set ARCH_DATA_MODEL=64
@set ARCH=amd64
@set PLATFORM=windows
@set ALT_DROPS_DIR=D:/DiskF/OpenJDK/openjdk7_VS2010_x64/drops

rem 这两个变量要置空
@set JAVA_HOME=
@set CLASSPATH=

rem 个人爱好
@color 02
@title OpenJDK+VS2010

@cmd

10、运行run.bat

#测试配置:
make sanity
#没有错误的话:
make

我遇到的问题:
1、主要死到了MT和MD上,这个我修改了Makefile,一定要和FreeType保持一致
2、还有FreeType.dll,我编译的是个大Lib,所以Makefile里拷贝dll的语句要去掉
3、corba的字符集问题,要把Makefile里的ascii去掉,因为生成的注释有中文,显然要出错
4、EXE冲突,我的工具版本很多,估计一般人没这么多问题,最后改了PATH,Find改了名称
比如win的find和cygwin的find,Oracle的zip和cygwin的zip
同样,cygwin和(mingw、GnuSetup、GnuWin)的冲突,也要注意
5、还有一个,就是bat中的路径,除Path外尽量用/,因为linux下,\是转义用的
6、尝试了MinGW,发现不够给力啊

如何将JVM弄崩溃

什么是JVM的崩溃呢?
JVM已经无法抛出异常了,你会看到这样的错误

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_STACK_OVERFLOW (0xc00000fd) at pc=0x6d8a99c6, pid=2572, tid=964
#
# JRE version: 6.0_22-b04
# Java VM: Java HotSpot(TM) Client VM (17.1-b03 mixed mode, sharing windows-x86
)
# Problematic frame:
# V  [jvm.dll+0x99c6]
#
# An error report file with more information is saved as:
# D:\E\Projects\Java\Crash\hs_err_pid2572.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

同时会生成hs_err_pidxxxx.log的日志文件。

怎么把JVM弄崩溃呢?
总结了一下,感觉有三种方法
1是利用编译器及JVM自身特性,导致不可恢复的灾难;
2是利用JDK或JVM的bug;
3是用JNI,让JVM鞭长莫及,无论是sun提供的,还是我们自己写的;

import sun.dc.pr.PathDasher; 
import sun.misc.Unsafe;

//方法1
//我最认可的方法
public static void main(String[] args) {
    Object[] o = null;
    while (true) {
        o = new Object[] { o };
    }
}

//方法2
//JDK1.6u23 以前版本中的bug
public static void main(String[] args) {
    Double.parseDouble("2.2250738585072012e-308");
}

//方法3
//JNI
public static void main(String[] args)
{    
    PathDasher dasher = new PathDasher(null) ;
}

//方法4
//JNI
//java -Xbootclasspath/p:. Crash
private static final Unsafe unsafe = Unsafe.getUnsafe();
public static void crash()
{
    unsafe.putAddress(0, 0);
}

public static void main(String[] args) {
    crash();
}