在cygwin上编译hsdis(Java HotSpot反汇编程序插件)时,错误的reloc地址0x0

时间:2014-01-10 11:10:14

标签: java c compilation cygwin jvm-hotspot

我正在尝试编译JVM需要反汇编JIT编译代码的hsdis-amd64.dll库。

我遵循了this接受的答案。

我创建了一个像这样的文件夹结构:

+
+- hsdis             // unzipped dir hotspot/src/share/tools/hsdis of openjdk zip
+- binutils-2.24     // unzipped binutils-2.24.tar.gz

首先,我尝试使用以下方法编译它:

$ make OS=Linux MINGW=x86_64-w64-mingw32 BINUTILS=../binutils-2.24

但是

失败了
/Linux-amd64/opcodes/libopcodes.a build/Linux-amd64/libiberty/libiberty.a
hsdis.c:32:20: fatal error: sysdep.h: No such file or directory
#include <sysdep.h>
                ^
compilation terminated.

所以我应用了this accepted answer中提供的补丁并再次尝试。

编译再次失败

In file included from hsdis.c:34:0:
build/Linux-amd64/bfd/bfd.h:35:2: error: #error config.h must be included before this header
#error config.h must be included before this header
^

我遵循了编译器的提议,并在config.h包含之前添加了errno.h

然后错误是

e -I../binutils-2.24/bfd -Ibuild/Linux-amd64/bfd -DLIBARCH_amd64 -DLIBARCH=\"amd64\" -DLIB_EXT=\".dll\" -O hsdis.c -shared build/Linux-amd64/bfd/libbfd.a build/Linux-amd64/opcodes/libopcodes.a build/Linux-amd64/libiberty/libiberty.a
build/Linux-amd64/bfd/libbfd.a(compress.o):compress.c:(.text+0x15): undefined reference to `compressBound'
build/Linux-amd64/bfd/libbfd.a(compress.o):compress.c:(.text+0x48): undefined reference to `compress'
build/Linux-amd64/bfd/libbfd.a(compress.o):compress.c:(.text+0x28a): undefined reference to `inflateInit_'
build/Linux-amd64/bfd/libbfd.a(compress.o):compress.c:(.text+0x2c7): undefined reference to `inflate'
build/Linux-amd64/bfd/libbfd.a(compress.o):compress.c:(.text+0x2d6): undefined reference to `inflateReset'
build/Linux-amd64/bfd/libbfd.a(compress.o):compress.c:(.text+0x2f1): undefined reference to `inflateEnd'
/usr/lib/gcc/x86_64-w64-mingw32/4.8.1/../../../../x86_64-w64-mingw32/bin/ld: build/Linux-amd64/bfd/libbfd.a(compress.o): bad reloc address 0x0 in section `.pdata'
collect2: error: ld returned 1 exit status

我知道这是一个链接器问题。对我而言,它似乎试图链接错误的版本,但我可能是错的。

有谁知道如何解决这个问题或者可以告诉我如何编译hsdis(HotSpot反汇编程序插件)?

2 个答案:

答案 0 :(得分:3)

问题可以在Marat Buharov的回答之后解决。

然而,这里有一些链接,你可以找到一个预先编译的hsdis插件:

我用jdk1.7.0_02尝试http://lafo.ssw.uni-linz.ac.at/hsdis/intel/hsdis-amd64.dll并且它有效。

答案 1 :(得分:2)

需要添加针对zlib的链接(确保在cygwin中安装包mingw64-x86_64-zlib)。 correct zlib package for x86_64

然后在编辑器中打开Makefile,找到规则:

$(TARGET): $(SOURCE) $(LIBS) $(LIBRARIES) $(TARGET_DIR)
    $(CC) $(OUTFLAGS) $(CPPFLAGS) $(CFLAGS) $(SOURCE) $(DLDFLAGS) $(LIBRARIES)

添加&#34; -static -lz&#34;到第二行:

$(TARGET): $(SOURCE) $(LIBS) $(LIBRARIES) $(TARGET_DIR)
    $(CC) $(OUTFLAGS) $(CPPFLAGS) $(CFLAGS) $(SOURCE) $(DLDFLAGS) $(LIBRARIES) -static -lz