adresse de relocalisation incorrecte 0x0 lors de la compilation de hsdis (plug-in de désassembleur Java HotSpot) sur cygwin

J’essaie de comstackr la bibliothèque hsdis-amd64.dll dont la JVM a besoin pour désassembler le code compilé JIT.

J’ai suivi cette réponse acceptée.

  • J’ai installé cygwin
  • téléchargé openjdk-7u40-fcs-src-b43-26_aug_2013.zip
  • et téléchargé binutils-2.24.tar.gz

J’ai créé une structure de dossier comme celle-ci:

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

J’ai d’abord essayé de le comstackr en utilisant:

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

mais il a échoué avec

 /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  ^ compilation terminated. 

J’ai donc appliqué le correctif fourni dans cette réponse acceptée et réessayé.

La compilation a encore échoué

 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 ^ 

J’ai suivi la proposition du compilateur et ajouté config.h juste avant le errno.h include.

Alors l’erreur est

 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 

Je sais que c’est un problème de linker. Pour moi, il semble qu’il essaie de créer un lien avec une mauvaise version, mais j’ai peut-être tort.

Est-ce que quelqu’un sait comment résoudre ce problème ou peut me dire comment comstackr le hsdis (HotSpot Disassembler plugin)?

Il est nécessaire d’append des liens vers zlib (Assurez-vous d’installer le paquetage mingw64-x86_64-zlib dans cygwin). package zlib correct pour x86_64

Puis ouvrez Makefile dans l’éditeur, recherchez la règle:

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

Ajoutez “-static -lz” à la deuxième ligne pour faire cela:

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

Le problème pourrait être résolu après la réponse de Marat Buharov.

Néanmoins, voici quelques liens où vous pouvez trouver un plugin hsdis pré-comilé:

J’ai essayé http://lafo.ssw.uni-linz.ac.at/hsdis/intel/hsdis-amd64.dll avec jdk1.7.0_02 et cela a fonctionné.