整体编译过程还是比较简单,本文简单记录下
喜欢自己研究的同学可以读下openjdk里hotspot/src/share/tools/hsdis的README文件,里面有关于如何编译的详细描述。下面简单总结下要点。
编译的核心要点:由于hsdis需要依赖binutils这个库,所以关键是选择这个库的版本,通过README的描述可知,openjdk8里依赖的版本需要在2.29.1 - 2.31.1 本人使用的版本为2.30
下载地址贴2个,一个是README里提到的官方地址,一个是自己使用的地址(来自网络)
http://directory.fsf.org/project/binutils # 官方
http://ftp.heanet.ie/mirrors/ftp.gnu.org/gnu/binutils/ # 自己使用的
编译执行的详细命令如下
cd hotspot/src/share/tools/hsdis
wget http://ftp.heanet.ie/mirrors/ftp.gnu.org/gnu/binutils/binutils-2.30.1.tar.gz
tar xf binutils-2.30.tar.gz
make BINUTILS=binutils-2.30 ARCH=amd64 # 核心步骤,执行编译
# 将编译的产出hsdis-amd64.dylib 拷贝到openjdk/jdk/lib目录下即可使用
cp hsdis-amd64.dylib ../../../../../../../build/macosx-x86_64-normal-server-slowdebug/jdk/lib/
# 使用示例命令
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -cp "/Users/jsonqiao/Code/jdk8_dev" A
展示java源码相应的汇编代码效果
0x0000000104ffd55e: mov %rsi,%rdi ;*return
; - java.lang.Object::<init>@0 (line 37)
0x0000000104ffd561: mov %rsi,0x20(%rsp)
0x0000000104ffd566: callq 0x0000000104fc0c60 ; OopMap{[32]=Oop off=107}
;*return
; - java.lang.Object::<init>@0 (line 37)
; {runtime_call}
0x0000000104ffd56b: add $0x30,%rsp
0x0000000104ffd56f: pop %rbp
0x0000000104ffd570: test %eax,-0x3a48476(%rip) # 0x00000001015b5100
; {poll_return}
0x0000000104ffd576: retq
;; CounterOverflowStub slow case
0x0000000104ffd577: mov %rdi,0x8(%rsp)
0x0000000104ffd57c: movq $0xffffffffffffffff,(%rsp)
0x0000000104ffd584: callq 0x0000000104fca860 ; OopMap{rsi=Oop off=137}
;*synchronization entry
; - java.lang.Object::<init>@-1 (line 37)