关于交叉编译hsdis的问题[openjdk8 for aarch64]

Jefen 2013-08-20
这两天想把openjdk8的汇编代码输出来看下,网上查了下资料,需要安装hsdis,
但尝试了很多种方法,总是没有成功,不知道谁对这方面比较了解,给支个招?

1.网上下载的openjdk8 for arrch64,目前这个已编译成功,可以在板子正常运行,没有问题

2.发现有个hotspot\src\share\tools\hsdis目录,但image下并没有该文件,于是参考makefile手动把hsdic.c编译为.so,放到相应的目录中,运行测试代码,提示找不到相应的.so,汇编打印关闭

3.然后仔细阅读了readme,发现其依赖于binutils,下载了很多个版本,后面找到了支持arm版本的binutils,下载并解压,编译后输出.so,但file it,却发现是个x86-64平台的版本,虽然指定了target,-DTARGET_ARCH_aarch64,但编译出来仍是个x86-64版本

4.然后我仔细阅读了jdk8的另一个说明,发现在关于支持arm模拟器的这段提到了hsdis,他说在编译镜像的时候会自动编译模拟器,与hsdis.so的,并且查看了相应脚本,发现其生成的hdsis.so就是从x86-64编译过来,那么我就怀疑这个是不是只是为模拟器做的,其本质还是x86-64,要像编译aarch64版本的,可能还要自己写makefile,那ms有点不大好搞,不知大家怎么看?

现在有我有几个问题,还不是很确认:
1.为什么,我手动编译的.so,无法识别,如果我想调试,不如怎么进行,.so加载的过程是什么,是hotspot哪块来管理的,为什么会提示找不到,binutils的问题,应该不会影响加载才对?

2.openjdk8现在到底支不支持hsdis,他的makfile目前是不是只支持模拟器,对于aarch64目前还不支持?
RednaxelaFX 2013-08-20
有好几个地方可能出问题

我没怎么跟进AArch64 port的近况,但hsdis.c自身是平台无关的,真正平台相关的部分都依赖binutils来实现。所以如果链接到正确的binutils以及用正确的cross compiler来编译的话应该OK才对。
(但我之前想自己在Ubuntu x64上交叉编译出Windows x64的hsdis都弄不成功…实在是没脸见人啊 T.T)

hsdis插件编译出来之后,如果你确信那个so是对的,那么请试试扔到 $JDK/jre/lib/<arch>/ 和 $JDK/jre/lib/<arch>/server 里。HotSpot对hsdis的搜索路径包括上述两个位置,但不知道为啥有时候扔server目录会认不出来(诡异…)
注意插件的名字应该是hsdis-<arch>.so(libhsdis-<arch>.so也行不过最好用前面那个版本)。
Jefen 2013-08-20
第一次我是用我编译jdk8 for aarch64的sysroot来编译的,我把makefile改的很简单的,就是一个编译的过程,我只是想先看下效果,其中binutils和交叉编译工具用的也都是sysroot下的,编译出来放在相应的目录下,我是放$JDK/jre/lib/<arch>/client目录的,我编译的是client版本,但运行的时候提示
"Could not load hsdis-aarch64.so; library not loadable; PrintAssembly is disabled”,如果没有链接到正确的binutils,也不应该是这个提示吧?

第二次编译,我是用自带的makefile的,生成的build目录下的makefile,他是用系统自带的工具链的,而没有指定的交叉工具链的地方,而且我在makefile下看下有如下配置
else   #linux gogo
CPU  = $(shell uname -m)  
##这里其实我也改过,这个会复到宿主机的,我强制改成aarch64过,他budid下生成的aarch64目录,不过实际文件还是x86的,而且该部分主要应该还是生成binxx的
ARCH1=$(CPU:x86_64=amd64)
ARCH=$(ARCH1:i686=i386)
ifeq ($(BUILD_AARCH64),true)
CONFIGURE_ARGS= --target=aarch64-none-linux-gnu
LP64=1
CFLAGS+= -DTARGET_ARCH_aarch64




,其target,CFLAGS什么的都是基于aarch64的,但binxx,这个是运行在主机系统的,那么该文件是否应该不应该指定交叉工具的,那么如果手工修改,那要怎么修改,这个ms比较复杂了..(一些要指定交叉编译工具,一些可能要用本地的,一些还要用我最后生成的binxx文件)
现在我第二把编译出来的.so,我file看了下,发现他是基于x86-64的,按有些readme的说法,这个是和模拟器一起编译的,那可能只是模拟器用用的,模拟器就是运行在x86平台下的。。。

现在我的想法有两个方向,不过都不好做。。
1)调试下加载过程,看下,为什么会提示找不到,是因为什么原因找不到,想先从打印信息入出,不知道能不能找得到断点...
2)仔细研究下makefile,把各个阶段的工具链都指定清楚,确保工具使用正确,现成的,也不知道有没有....
Jefen 2013-08-20
发了半天,老是出错,还以为没发出来呢,结果发不出来了。。。
终于跑起来了。。。
搜了下代码,Disassembler::load_library时,会显示上面那些提示信息的,不过还没开始调试,然后先尝试了第二把...
仔细看了下,这个编译就是几部分,编译binutils,生成几个静态链接文件,然后链接生成最后的.so,也就是他需要的实现,一部分在hsdis.c里,一部分在binutils里,而jdk8目录下应该是直接用gcc编译的,是不能直接使用的
所以我把makefile给改了,主要是configure的时候,添加hots参数,然后把cc修改为所在的交叉编译工具(cross-gcc),sysroot没有设,好像也是可以的,不过我没有拿到板子去拿,我跑的是设过的,但只设了ld参数,cflag参数configue会报错的。。。
然后readelf出来的发现未知,吓了一跳,然后用cross-readelf就可以正常显示了
RednaxelaFX 2013-08-20
Jefen 写道
发了半天,老是出错,还以为没发出来呢,结果发不出来了。。。
终于跑起来了。。。

楼主V5!
HLLVM群组可以共享文件的,位置在这里:http://hllvm.group.iteye.com/group/share
楼主如果编译出了现成的AArch64版hsdis愿意共享出来的话欢迎在这边共享一份,谢谢!
Jefen 2013-08-20
嗯,好
我上传了下。。。

这个网站,我们公司很难打开,基本要刷很多次,才能打开会,比较麻烦。。。
版主,主要出没在这个网站吗?
RednaxelaFX 2013-08-20
Jefen 写道
嗯,好
我上传了下。。。

感谢!~~

Jefen 写道
这个网站,我们公司很难打开,基本要刷很多次,才能打开会,比较麻烦。。。
版主,主要出没在这个网站吗?

嗯,现在是…然后就是微博了吧大概
Global site tag (gtag.js) - Google Analytics