mac上编译openjdk8的hsdis插件

339 阅读1分钟

整体编译过程还是比较简单,本文简单记录下

喜欢自己研究的同学可以读下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)