Mylib.so имеет текстовые перестановки. Это напрасно тратит память и представляет угрозу безопасности. Пожалуйста исправьте
Мое приложение для Android (с использованием родной библиотеки) напечатает это предупреждение на Android 4.4:
linker mylib.so имеет перемещение текста. Это напрасно тратит память и представляет угрозу безопасности. Пожалуйста, исправьте.
У вас есть представление о том, что это такое и как его исправить?
Спасибо,
Ответы
Ответ 1
Это, по-видимому, является результатом двух ошибок ndk-gcc, упомянутых в https://code.google.com/p/android/issues/detail?id=23203
и заявил, что он был зафиксирован как ndk-r8c.
Похоже, что проверка для библиотек с проблемой была добавлена только недавно.
Примечание: пожалуйста, не отредактировать это сообщение, чтобы скрыть URL ссылки. Это явное, потому что назначение является тем, что делает его авторитетным.
Дополнительная заметка Изменение версий NDK - это только исправление, когда предупреждение связано с кодом вашего приложения. Он будет иметь без эффекта, если вместо этого стоит предупреждение на системном компоненте, таком как libdvm, который может быть исправлен только при обновлении системы.
Ответ 2
Вам нужно сделать код в своей ячейке независимой... добавьте -fpic
или -fpic
к вашему LOCALC_FLAGS
в Android.mk, и вам также необходимо убедиться, что вы не связываетесь с каким-либо статическим или разделяемые библиотеки, которые сами содержат ретрансляции текста. Если они это сделают, и вы можете скомпилировать их, используйте один из упомянутых выше флагов.
Ответ 3
Короче говоря, вам нужно скомпилировать вашу библиотеку с одним из флагов -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
. Подробнее о том, как писать правильные динамические библиотеки это обязательное чтение.
Ответ 4
Я получил ту же ошибку с моим приложением.
Приложение использовало собственный демона, который использовал собственную библиотеку, которая не выполняла все функции в своем заголовочном файле. Когда я добавил необходимые реализации в родную библиотеку, все просто сработало.
Я не знаю, есть ли у вас такая же проблема, но это, вероятно, означает, что ваша родная сторона имеет некоторое несоответствие.
Ответ 5
Переезд libnba2k13.so:relocations