Ошибка android динамически загружает libc ++. Поэтому родная библиотека

Я пытаюсь создать доказательство концепции Android-приложения, которое использует код OpenSSH для установки сеанса SSH с сервером.

Для этого я использую источники android для создания необходимых библиотек, а затем вытаскиваю их в собственный проект AndroidStudio, где все должно быть упаковано и установлено на устройстве.

Однако одна из библиотек (libc ++. So) не загружается динамически на устройстве с сообщением « java.lang.UnsatisfiedLinkError: dlopen failed: не удается найти символ« __register_atfork », на который ссылается« libc ++. So »… »

Эта ошибка возникает при загрузке libc ++, поэтому библиотека из java-кода MainActivity (теперь я загружаю одну библиотеку за раз, чтобы убедиться, где она не работает):

public class MainActivity extends AppCompatListActivity implements OnHostStatusChangedListener { ................... static { System.loadLibrary("dl"); System.loadLibrary("c"); System.loadLibrary("m"); System.loadLibrary("c++"); // <--- Error dlopen failed: cannot locate symbol "__register_atfork" referenced by "libc++.so System.loadLibrary("ssh"); System.loadLibrary("vrx-native"); } ............. } 

Моя интерпретация сообщения об ошибке заключается в том, что символ __register_atfork, требуемый libc ++, поэтому не определен ни одной из других библиотек. Но, изучая таблицы символов библиотек, я не понимаю, почему dlopen не распознает символ, определенный в libc.so:

 $readelf -s libc++.so Symbol table '.dynsym' contains 2367 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND ..................... 3: 00000000 0 FUNC GLOBAL DEFAULT UND __register_atfork@LIBC (2) <-- Undefined symbol reference ..................... $readelf -s libc.so Symbol table '.dynsym' contains 1505 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND ............. 62: 00043509 120 FUNC GLOBAL DEFAULT 13 __register_atfork@@LIBC .............. 7518: 00043509 120 FUNC GLOBAL DEFAULT 13 __register_atfork <-- symbol defined and exported by libc.so!!! 

Изучение заголовка и динамического раздела библиотек также не дает никакого представления о том, почему это может быть неудачно:

 $ readelf -hd libc++.so ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: ARM Version: 0x1 Entry point address: 0x0 Start of program headers: 52 (bytes into file) Start of section headers: 573972 (bytes into file) Flags: 0x5000200, Version5 EABI, soft-float ABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 9 Size of section headers: 40 (bytes) Number of section headers: 29 Section header string table index: 28 Dynamic section at offset 0x8abf8 contains 29 entries: Tag Type Name/Value 0x00000003 (PLTGOT) 0x8dfe8 0x00000002 (PLTRELSZ) 8216 (bytes) 0x00000017 (JMPREL) 0x2d738 0x00000014 (PLTREL) REL 0x6000000f (Operating System specific: 6000000f) 0x2b280 0x60000010 (Operating System specific: 60000010) 0x24b8 0x00000013 (RELENT) 8 (bytes) 0x6ffffffa (RELCOUNT) 397 0x00000006 (SYMTAB) 0x21a0 0x0000000b (SYMENT) 16 (bytes) 0x00000005 (STRTAB) 0xb590 0x0000000a (STRSZ) 107756 (bytes) 0x00000004 (HASH) 0x25a7c 0x00000001 (NEEDED) Shared library: [libdl.so] 0x00000001 (NEEDED) Shared library: [libc.so] 0x00000001 (NEEDED) Shared library: [libm.so] 0x0000000e (SONAME) Library soname: [libc++.so] 0x0000001a (FINI_ARRAY) 0x8b3c0 0x0000001c (FINI_ARRAYSZ) 4 (bytes) 0x00000019 (INIT_ARRAY) 0x8dbf4 0x0000001b (INIT_ARRAYSZ) 4 (bytes) 0x0000001e (FLAGS) BIND_NOW 0x6ffffffb (FLAGS_1) Flags: NOW 0x6ffffff0 (VERSYM) 0x29f94 0x6ffffffc (VERDEF) 0x2b214 0x6ffffffd (VERDEFNUM) 1 0x6ffffffe (VERNEED) 0x2b230 0x6fffffff (VERNEEDNUM) 2 0x00000000 (NULL) 0x0 $ readelf -hd libc.so ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: ARM Version: 0x1 Entry point address: 0x0 Start of program headers: 52 (bytes into file) Start of section headers: 757116 (bytes into file) Flags: 0x5000200, Version5 EABI, soft-float ABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 10 Size of section headers: 40 (bytes) Number of section headers: 33 Section header string table index: 30 Dynamic section at offset 0x8232c contains 27 entries: Tag Type Name/Value 0x00000003 (PLTGOT) 0x835bc 0x00000002 (PLTRELSZ) 5232 (bytes) 0x00000017 (JMPREL) 0x105c4 0x00000014 (PLTREL) REL 0x00000011 (REL) 0xd85c 0x00000012 (RELSZ) 11624 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x6ffffffa (RELCOUNT) 1304 0x00000006 (SYMTAB) 0x1c0 0x0000000b (SYMENT) 16 (bytes) 0x00000005 (STRTAB) 0x5fd0 0x0000000a (STRSZ) 17483 (bytes) 0x00000004 (HASH) 0xa41c 0x00000001 (NEEDED) Shared library: [libdl.so] 0x0000000e (SONAME) Library soname: [libc.so] 0x00000019 (INIT_ARRAY) 0x83304 0x0000001b (INIT_ARRAYSZ) 36 (bytes) 0x0000001a (FINI_ARRAY) 0x83328 0x0000001c (FINI_ARRAYSZ) 4 (bytes) 0x0000001e (FLAGS) BIND_NOW 0x6ffffffb (FLAGS_1) Flags: NOW 0x6ffffff0 (VERSYM) 0xcbc4 0x6ffffffc (VERDEF) 0xd788 0x6ffffffd (VERDEFNUM) 5 0x6ffffffe (VERNEED) 0xd82c 0x6fffffff (VERNEEDNUM) 1 0x00000000 (NULL) 0x0 

Любая помощь была оценена

Обновление: исследование значения (2) на __register_atfork@LIBC (2)

Проверяя исходные источники, мы видим, что маркер (2) печатается с:

 if (version_string) { if (sym_info == symbol_undefined) printf ("@%s (%d)", version_string, vna_other); else printf (sym_info == symbol_hidden ? "@%s" : "@@%s", version_string); } 

vna_other загружается из структуры Elf32_External_Sym , member st_other

 typedef struct { unsigned char st_name[4]; /* Symbol name, index in string tbl */ unsigned char st_value[4]; /* Value of the symbol */ unsigned char st_size[4]; /* Associated symbol size */ unsigned char st_info[1]; /* Type and binding attributes */ unsigned char st_other[1]; /* No defined meaning, 0 */ unsigned char st_shndx[2]; /* Associated section index */ } Elf32_External_Sym; 

В спецификации ELF (на стр. 32):

St_other Этот член в настоящее время содержит 0 и не имеет определенного значения.

Может быть, это имеет особое значение для ARM ? Нет, этот документ не определяет что-то конкретное для st_other

Обновление: исследование значения st_other в определении файла ELF

Нашел этот пост под названием « Запрос на расширение видимости символов» (st_other)

В настоящее время видимость символа представлена ​​наименее значимыми 2 битами поля st_other символа.

В сообщении упоминаются атрибуты видимости, которые в настоящее время st_other в st_other

 #define STV_DEFAULT 0 #define STV_INTERNAL 1 #define STV_HIDDEN 2 #define STV_PROTECTED 3 

… и предлагает два новых атрибута видимости …

 #define STV_SINGLETON 4 #define STV_ELIMINATE 5 

Кажется, что (2) на выходе таблицы символа readelf соответствует STV_HIDDEN на символе st_other member …