неверный адрес reloc 0x0 при компиляции hsdis (плагин дизассемблера Java HotSpot) на cygwin

Я пытаюсь скомпилировать библиотеку hsdis-amd64.dll, которая нужна JVM для дизассемблирования скомпилированного JIT-кода.

Я последовал этому принятому ответу.

Я создал такую ​​структуру папок:

+
+- 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.

Поэтому я применил патч, предоставленный в этот принятый ответ и попробовал снова.

Компиляция снова не удалась

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)?


person René Link    schedule 10.01.2014    source источник


Ответы (2)


Необходимо добавить ссылку на zlib (убедитесь, что вы установили пакет mingw64-x86_64-zlib в cygwin). правильный пакет zlib для x86_64

Затем откройте Makefile в редакторе, найдите правило:

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

Добавьте «-static -lz» во вторую строку, чтобы сделать это:

$(TARGET): $(SOURCE) $(LIBS) $(LIBRARIES) $(TARGET_DIR)
    $(CC) $(OUTFLAGS) $(CPPFLAGS) $(CFLAGS) $(SOURCE) $(DLDFLAGS) $(LIBRARIES) -static -lz
person Marat Buharov    schedule 14.01.2014
comment
Вам необходимо установить пакет mingw64-x86_64-zlib в cygwin. - person Marat Buharov; 17.01.2014
comment
Вам нужно установить mingw64-x86_64-zlib (на скриншоте вы не совпадаете с zlib-devel) - person Marat Buharov; 17.01.2014
comment
Проверьте наличие ls /usr/x86_64-w64-mingw32/sys-root/mingw/lib/libz.* в консоли cygwin. Там (если правильно установлен zlib для Win64 toolchain) должны быть два файла: libz.a и libz.dll.a - person Marat Buharov; 17.01.2014
comment
Спасибо, теперь он отлично компилируется после того, как я сделал make clean. - person René Link; 17.01.2014

Проблема может быть решена после ответа Марата Бухарова.

Тем не менее, вот несколько ссылок, где вы можете найти предварительно скомпилированный плагин hsdis:

Я попробовал http://lafo.ssw.uni-linz.ac.at/hsdis/intel/hsdis-amd64.dll с jdk1.7.0_02, и это сработало.

person René Link    schedule 10.01.2014