Java не может сопоставить собственную библиотеку - PullRequest
0 голосов
/ 25 января 2019

У меня проблема с тем, что Java пытается загрузить объект .so, но не может отобразить его, поэтому происходит сбой.Как я могу отладить в такой ситуации?

Вот команда (попробуйте запустить утилиту HDFView):

/ usr / lib / jvm / java-11-openjdk-amd64 // bin / java -Djava.library.path = / usr / lib / jni /: / usr / lib / x86_64-linux-gnu / -Dswing.systemlaf = com.sun.java.swing.plaf.gtk.GTKLookAndFeel -classpath /usr/share/java/jhdf.jar:/usr/share/java/jhdf5.jar:/usr/share/java/jhdfobj.jar:/usr/share/java/jhdf4obj.jar:/USR / доли / Java / jhdf5obj.jar: /usr/share/java/jhdfview.jar: /usr/share/java/jgraph.jar: /usr/share/java/slf4j-api.jar: / USR / доли /java / slf4j-nop.jar ncsa.hdf.view.HDFView -root / usr / share / doc / libjhdf-doc /

Вот вывод ошибки:

Исключение в потоке "main" java.lang.UnsatisfiedLinkError: /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt_xawt.so: libxcb.so.1: не удалось сопоставить сегмент из общего объекта в java.base / java.lang.ClassLoader $ NativeLibrary.load0 (собственный метод) в java.base / java.lang.ClassLoader $ NativeLibrary.load (ClassLoader.java: 2430) в java.base / java.lang.ClassLoader $ NativeLibrary.loadLibrary (ClassLoader.java:2487) в java.base / java.lang.ClassLoader.loadLibrary0 (ClassLoader.java:2684) в java.base / java.lang.ClassLoader.loadLibrary (ClassLoader.java:2617) в java.base / java.lang.Runtime.load0 (Runtime.java:767) в java.base / java.lang.System.load (System.java:1831) в java.base / java.lang.ClassLoader $ NativeLibrary.load0 (собственный метод) в java.base / java.lang.ClassLoader $ NativeLibrary.load (ClassLoader.java:2430) в java.base / java.lang.ClassLoader$ NativeLibrary.loadLibrary (ClassLoader.java:2487) в java.base / java.lang.ClassLoader.loadLibrary0 (ClassLoader.java:2684) в java.base / java.lang.ClassLoader.loadLibrary (ClassLoader.java:2638 в)java.base / java.lang.Runtime.loadLibrary0 (Runtime.java:829) в java.base / java.lang.System.loadLibrary (System.java:1867) в java.desktop / java.awt.Toolkit $ 3.run(Toolkit.java:1395) в java.desktop / java.awt.Toolkit $ 3.run (Toolkit.java:1393) в java.base / java.security.AccessController.doPrivileged (собственный метод) в java.desktop / java.awt.Toolkit.loadLibraries (Toolkit.java:1392) в java.desktop / java.awt.Toolkit. (Toolkit.java:1425) в java.desktop / java.awt.Component. (Component.java:621)

Другие интересные факты:

  • Выполнение той же команды с "sudo" впереди дает ту же ошибку, нос другой библиотекой.

  • Выполнение той же команды после первого повышения с помощью «sudo su» не выдает ошибок, хотя приложение не работает должным образом.

  • Библиотеки имеют разрешение на чтение.Я попытался поднять их, чтобы выполнить разрешение, но это ничего не изменило.

  • Выполнение команды в ValGrind привело к очень большому количеству выходных данных, заполненных жалобами, но в итоге запустило приложение вместосбой.

  • У меня проблемы с использованием gdb для подключения к процессу и извлечения информации.

  • Я прошел исходный код glibc иopenjdk11, но не нашел понимания.Strace и ltrace, похоже, не помогли.

  • Многие вопросы SO касаются проблем пути к классам и пути к библиотекам, но, похоже, это не проблема.Насколько я могу судить, он находит библиотеки просто отлично, но затем не может отобразить их.

  • Библиотека находится в файловой системе, которая не смонтирована noexec.

Вывод запрошен комментарием

От ldd /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt_xawt.so

linux-vdso.so.1 (0x00007ffda2ffd000)
libgtk3-nocsd.so.0 => /usr/lib/x86_64-linux-gnu/libgtk3-nocsd.so.0 (0x00007f6efd9b0000)     
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6efd612000)   
libawt.so => /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt.so (0x00007f6efd342000)  
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f6efd130000)     
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f6efcdf8000)   
libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f6efcbee000)   
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6efc9ea000)     
libXtst.so.6 => /usr/lib/x86_64-linux-gnu/libXtst.so.6 (0x00007f6efc7e4000)     
libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f6efc5d4000)     
libjava.so
    => /usr/lib/jvm/java-11-openjdk-amd64/lib/libjava.so (0x00007f6efc3a7000)   
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6efc188000)   
libc.so.6
    => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6efbd97000)     
/lib64/ld-linux-x86-64.so.2 (0x00007f6efde1a000)    
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f6efbb6f000)   
libjvm.so => not found  
libverify.so => /usr/lib/jvm/java-11-openjdk-amd64/lib/libverify.so (0x00007f6efb960000)    
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f6efb75c000)   
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f6efb556000)   
libjvm.so => not found  
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f6efb341000)    
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f6efb139000)

Вывод из файла -L /usr/lib/x86_64-linux-gnu/libxcb.so.1:

/usr/lib/x86_64-linux-gnu/libxcb.so.1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=4cc7a1f024b6a0511ed01e149f2f198c2532e5fd, stripped

Поскольку он говорит, что libjvm необходим, я перешел на openjdk-8, который имеетlibjvm.so.Тогда результаты были

GLib (gthread-posix.c): Unexpected error from C library during 'malloc': Cannot allocate memory.  Aborting.

В ответ на это добавил -Xmx500M к вызову (используя любую версию Java), и он работает без диагностики.Однако приложение не работает.Например, я могу просмотреть файл HDF5, но он утверждает, что файл пуст, когда это не так.Он также не может создавать новые файлы, которые являются стандартными функциями для этого приложения.Поэтому я не уверен, что я только что замаскировал проблему или решил ее.

...