Mylib.so имеет перестановки текста. Это трата памяти и представляет угрозу безопасности. Пожалуйста исправьте

Мое приложение Android (с использованием родной библиотеки) печатает это предупреждение на Android 4.4:

Linker mylib.so имеет текстовые перестановки. Это трата памяти и представляет угрозу безопасности. Пожалуйста исправьте.

У вас есть представление о том, что это такое и как его исправить? Благодаря,

Solutions Collecting From Web of "Mylib.so имеет перестановки текста. Это трата памяти и представляет угрозу безопасности. Пожалуйста исправьте"

Это, по-видимому, является результатом двух ошибок ndk-gcc, упомянутых на странице https://code.google.com/p/android/issues/detail?id=23203

И заявил, что он был зафиксирован как ndk-r8c.

Похоже, что проверка библиотек с проблемой была добавлена ​​только недавно.

Примечание. Пожалуйста , не редактируйте эту запись, чтобы скрыть URL ссылки. Это явное, потому что назначение – это то, что делает его авторитетным.

Дополнительная заметка Изменение версий NDK – это только исправление, когда предупреждение вызвано кодом вашего приложения. Это не будет иметь никакого эффекта, если вместо этого стоит предупреждение на системном компоненте, таком как libdvm, который может быть исправлен только при обновлении системы.

Вам необходимо сделать код в своей позиции в -fpic независимым … добавьте -fpic или -fPIC в свой LOCALC_FLAGS на вашем Android.mk, и вам также необходимо убедиться, что вы не связываетесь с любыми статическими или разделяемыми библиотеками, которые содержат перемещение текста самих себя. Если они это сделают, и вы можете перекомпилировать их, используйте один из указанных выше флажков.

Короче говоря, вам нужно скомпилировать вашу библиотеку с одним из флагов -fpic или -fPIC , где PIC является аббревиатурой для независимого кода позиции .

Более длинный ответ заключается в том, что ваш файл yourlib.so был скомпилирован таким образом, который не соответствует стандарту Google Android для файла ELF, где эта запись Dynamic Array Tag является неожиданным. В лучшем случае библиотека все равно будет работать, но она по-прежнему является ошибкой, и будущая версия AOS, вероятно, не позволит ей работать.

DT_TEXTREL 0x16 (22)

Чтобы проверить, что в вашей библиотеке используется что-то по строке:

 # readelf --wide -S yourlib.so There are 37 section headers, starting at offset 0x40: Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 0000000000000000 002400 068f80 00 AX 0 0 16 [ 2] .rodata PROGBITS 0000000000000000 06b380 05ad00 00 WA 0 0 32 ... [16] .rela.text RELA 0000000000000000 26b8e8 023040 18 14 1 8 ... [36] .rela.debug_frame RELA 0000000000000000 25a608 0112e0 18 14 27 8 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) 

Пожалуйста, ознакомьтесь с моим обширным ответом на эту тему, для получения дополнительной информации о DT entry . Подробнее о том, как писать правильные динамические библиотеки, является обязательным чтением .

Я получил ту же ошибку с моим приложением. Приложение использовало собственный демона, который использовал собственную библиотеку, которая не выполняла все функции в своем заголовочном файле. Когда я добавил необходимые реализации в родную библиотеку, все просто сработало.

Я не знаю, есть ли у вас одна и та же проблема, но это, вероятно, означает, что ваша родная сторона имеет некоторое несоответствие.