为什么要写这篇博客呢?在《深入理解java虚拟机》一书中,了解到hsdis这个工具,但是由于网上提供的支持windows的,要么是手动编译,要么要分。恰好分不够了,另外也想亲自手动编译下。当然,还有一个最重要的原因,根据在64位Windows上编译hsdis操作下来,遇到些问题,在这里记录下来。下面记录下我的手动编译hsdis的历程:
一、软件准备:
1.下载安装Cygwin(windows-64)
2.GNU-binutils安装(2.27)
二、安装Cygwin
1.Select Packages页面需要注意,在默认的基础上,需要额外安装的package有:
Devel - gcc-core
Devel - make
Devel - mingw64-x86_64-gcc-core
Devel - mingw64-x86_64-gcc-g++
Devel - texinfo
Utils - diffutils
2.修改Cygwin安装根目录下面的Cygwin.bat文件,在"D:"与"chdir"之间增加
(其中D:\Cygw修改为自己Cygwin的安装根 目录):
set CYGWIN=tty notitle globset LD_LIBRARY_PATH=D:\Cygw\lib;D:\Cygw\usr\lib;D:\Cygw\usr\local\libset PATH=%PATH%;D:\Cygw\bin;D:\Cygw\sbin;D:\Cygw\usr\bin;D:\Cygw\usr\sbin;D:\Cygw\usr\local\bin
三、安装完之后启动Cygwin,则会在Cygwin的安装目录下的home
下自动生成你的用户名命名的文件夹(下文记之为~
)
四、将下载的binutils解压到~
下
.../home/用户名/binutils-2.27/
五、解压hsdis源码
1.将下载的openJDK源码/src/share/tools/hsdis解压到~
下
.../home/用户名/hsdis/
六、修改Makefile文件
- 修改
~/hsdis/Makefile
文件,搜索LIBRARIES
,将LIBRARIES = $(TARGET_DIR)/bfd/libbfd.a \
$(TARGET_DIR)/opcodes/libopcodes.a \
$(TARGET_DIR)/libiberty/libiberty.a
修改为LIBRARIES = $(TARGET_DIR)/bfd/libbfd.a \
$(TARGET_DIR)/zlib/libz.a \
$(TARGET_DIR)/opcodes/libopcodes.a \
$(TARGET_DIR)/libiberty/libiberty.a
保存
- 在Cygwin窗口输入
cd ~/hsdis
- 然后输入命令
make OS=Linux MINGW=x86_64-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.27
- (最后的binutils路径需要与实际安装路径一致)
- 等待几分钟,如果最后没有报错,那么就build成功了,我们需要的
hsdis-amd64.dll
现在就在~/hsdis/build/Linux-amd64
里面了,
把它copy到$JAVA_HOME/jre/bin/server
(或$JAVA_HOME/jre/bin/client
)下就OK了。
2.如果执行失败而且如果发现command not found,可以重新执行Cygwin安装文件,
之后在select page页选择需要的安装包,重新执行步骤七
参考文章: