Java не может сопоставить нативную библиотеку

У меня возникла проблема, когда 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/share/java/jhdf5obj.jar:/usr/share/java/jhdfview.jar:/usr/share/java/jgraph.jar:/usr/share/java/slf4j-api.jar:/usr/share/java/slf4j-nop.jar ncsa.hdf.view.HDFView -root /usr/share/doc/libjhdf-doc/

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

Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt_xawt.so: libxcb.so.1: failed to map segment from shared object at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method) at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430) at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487) at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684) at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2617) at java.base/java.lang.Runtime.load0(Runtime.java:767) at java.base/java.lang.System.load(System.java:1831) at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method) at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2430) at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2487) at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684) at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2638) at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829) at java.base/java.lang.System.loadLibrary(System.java:1867) at java.desktop/java.awt.Toolkit$3.run(Toolkit.java:1395) at java.desktop/java.awt.Toolkit$3.run(Toolkit.java:1393) at java.base/java.security.AccessController.doPrivileged(Native Method) at java.desktop/java.awt.Toolkit.loadLibraries(Toolkit.java:1392) at java.desktop/java.awt.Toolkit.(Toolkit.java:1425) at 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, но он утверждает, что файл пуст, хотя это не так. Он также не может создавать новые файлы, которые являются стандартными функциями для этого приложения. Поэтому я не уверен, просто ли я замаскировал проблему или решил ее.

Что выдает ldd /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt_xawt.so и file -L /usr/lib/x86_64-linux-gnu/libxcb.so.1? (Пожалуйста, обновите свой вопрос с помощью вышеуказанной информации).

Employed Russian 27.01.2019 21:02

@EmployedRussian сделано.

Zach Boyd 28.01.2019 11:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
1 188
0

Другие вопросы по теме