Компоновщик Android NDK не может найти символ между двумя общими библиотекамиAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Компоновщик Android NDK не может найти символ между двумя общими библиотеками

Сообщение Anonymous »


Попытка использовать мою собственную библиотеку contribtests.so, которая обращается к динамически скомпилированной библиотеке BZip2 libbz2.so, всегда терпит неудачу при вызове System.loadLibrary("contribtests")

java.lang.UnsatisfiedLinkError: ошибка dlopen: невозможно найти символ «BZ2_bzlibVersion», на который ссылается "/data/app/~~aTgFU-pNoDjbLJvJTuDiiQ==/com.microcaet.contribtests

Я распаковал сгенерированный APK и с помощью Readelf проверил ситуацию. Обе библиотеки выглядят прекрасно

[llothar@linux-workstation a]$ readelf -d lib/arm64-v8a/libbz2.so Динамический раздел по смещению 0xf478 содержит 24 записи: Тип тега Имя/значение 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libdl.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libc.so] 0x000000000000000e (SONAME) Имя библиотеки: [libbz2.so] 0x000000000000001e (ФЛАГИ) BIND_NOW 0x000000006ffffffb (FLAGS_1) Флаги: СЕЙЧАС 0x0000000000000007 (РЕЛА) 0xd40 0x0000000000000008 (РЕЛАСЗ) 192 (байт) 0x0000000000000009 (RELAENT) 24 (байта) 0x000000006ffffff9 (РЕЛАКАУНТ) 3 0x0000000000000017 (JMPREL) 0xe00 0x0000000000000002 (PLTRELSZ) 840 (байт) 0x0000000000000003 (PLTGOT) 0x11620 0x0000000000000014 (PLTREL) RELA 0x0000000000000006 (СИМТАБ) 0x308 0x000000000000000b (SYMENT) 24 (байта) 0x0000000000000005 (СТРТАБ) 0x20098 0x000000000000000a (STRSZ) 800 (байт) 0x000000006ffffef5 (GNU_HASH) 0x928 0x000000000000001a (FINI_ARRAY) 0x11468 0x000000000000001c (FINI_ARRAYSZ) 16 (байт) 0x000000006ffffff0 (ВЕРСИМ) 0x890 0x000000006ffffffe (ВЕРНИД) 0x908 0x000000006ffffffff (ВЕРНЕЕДНУМ) 1 0x0000000000000000 (ПУСТО) 0x0 и это тот, который содержит вызовы JNI, которые вызывают bz2

[llothar@linux-workstation a]$ readelf -d lib/arm64-v8a/libcontribtests.so Динамический раздел по смещению 0x144d18 содержит 41 запись: Тип тега Имя/значение 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libzip.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libcurl.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libnghttp2.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libssl.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libcrypto.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libarchive.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libcares.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [liblzma.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libssh.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libbz2.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libzstd.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libz.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libandroid.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [liblog.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libm.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libdl.so] 0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [libc.so] 0x000000000000000e (SONAME) Имя библиотеки: [libcontribtests.so] 0x000000000000001e (ФЛАГИ) BIND_NOW 0x000000006ffffffb (FLAGS_1) Флаги: СЕЙЧАС 0x0000000000000007 (РЕЛА) 0x43268 0x0000000000000008 (РЕЛАСЗ) 78840 (байт) 0x0000000000000009 (RELAENT) 24 (байта) 0x000000006ffffff9 (ОТМЕНИТЬ СЧЕТ) 1287 0x0000000000000017 (JMPREL) 0x56660 0x0000000000000002 (PLTRELSZ) 27792 (байт) 0x0000000000000003 (PLTGOT) 0x147588 0x0000000000000014 (PLTREL) RELA 0x0000000000000006 (СИМТАБ) 0x330 0x000000000000000b (SYMENT) 24 (байта) 0x0000000000000005 (СТРТАБ) 0x188d4 0x000000000000000a (СТРСЗ) 174480 (байт) 0x000000006ffffef5 (GNU_HASH) 0x13188 0x0000000000000019 (INIT_ARRAY) 0x146ce8 0x000000000000001b (INIT_ARRAYSZ) 48 (байт) 0x000000000000001a (FINI_ARRAY) 0x146cd8 0x000000000000001c (FINI_ARRAYSZ) 16 (байт) 0x000000006ffffff0 (ВЕРСИМ) 0x119e8 0x000000006ffffffe (ВЕРНИД) 0x13124 0x000000006ffffffff (ВЕРНЕЕДНУМ) 3 0x0000000000000000 (ПУСТО) 0x0 При поиске упомянутого имени функции в сообщении об ошибке я нашел символы, определенные в libbz2.so и помеченные как UND (неопределенные) в вызывающей библиотеке.

[llothar@linux-workstation a]$ readelf -s lib/arm64-v8a/libbz2.so | grep bzlibVer 40: 000000000000d34c 12 FUNC GLOBAL DEFAULT 10 BZ2_bzlibVersion [llothar@linux-workstation a]$ readelf -s lib/arm64-v8a/libcontribtests.so | grep bzlibVer 5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND BZ2_bzlibVersion [llothar@linux-workstation a]$ Единственная идея состоит в том, что это может произойти потому, что при компиляции создается библиотека с семантическим номером версии "libbz2.so.1.0.9". Я использую инструмент patchelf для удаления «.1.0.9», выполняя «patchelf --set-soname new_name old_name», а затем переименовываю файл, потому что в противном случае gradle не упаковал бы версию в полученный APK.

В качестве теста я также сгенерировал «contribtests» в виде простого «main.c» для вызова функции и выполнил его как программу командной строки (загруженную через adb). Это работает с точно таким же переименованным файлом «libbz2.so», который я копирую в папку JniLib. Но я установил LD_LIBRARY_PATH перед запуском.

Как мне узнать, что происходит? Я сейчас совершенно беспомощен. Как исправить или отладить эту проблему? Я предполагаю, что файлы so уже правильно загружены. Значит, что-то в темных глубинах решения символов создает эту проблему.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»