2013-11-22 1 views
39

Моего Android приложения (используя встроенную библиотеку) распечатать это предупреждение на Android 4.4:mylib.so имеет текстовые перестановки. Это напрасно тратит память и представляет угрозу безопасности. Исправьте

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

У вас есть идея, что это такое и как его исправить? Спасибо,

ответ

24

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

и указанных там было исправлено в НДК-R8C.

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

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

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

+3

Такая же ошибка при установке утилиты apk с adb. Использование ndk-r9d. –

+3

Вы сказали «ошибка». Можно игнорировать? Или это вопрос * реальный *? Благодарю. – dentex

+1

@Chris Stratton У меня такое же предупреждение, и я использую android-ndk-r10e. Разве не возможно, что эта ошибка указывает на неправильное использование в lib.so. Например, не освобождение динамической памяти или чего-то еще – VMMF

1

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

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

+0

Что делать, если вы используете Java только в приложении и получаете предупреждение? – NoBugs

+3

Решение вашей проблемы не имеет никакого отношения к вопросу об этом вопросе. –

+0

Вопрос задает вопрос об исправлении этого предупреждения. У меня было такое же предупреждение, и исправление несоответствия решило проблему. Может быть, у вас нет собственного несоответствия, но это может помочь другим, у которых есть несоответствие и получить это предупреждение ... –

5

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

+0

Я пробовал в обеих зависимых lib и исполняемых файлах. Они скомпилированы, но у меня такое же предупреждение. Вы уверены, что это правильный переключатель? – dentex

+1

Вы должны убедиться, что используете правильный переключатель для типа дуги, для которого вы компилируете. Кроме того, вы можете использовать 'objdump' на своих .a или .so, чтобы узнать, есть ли у них перестановки текста. _ Они сами могут связываться с библиотеками, у которых есть перестановки. –

+1

Вы также должны трассировать 'LOCALC_FLAGS' (или любую другую эту переменную) с помощью скрипта сборки, чтобы узнать, передается ли он в соответствующие библиотеки. –

3

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

Чем дольше ответ, что ваш 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) 

Пожалуйста, смотрите my extensive answer по теме, для более DT entry деталей. Подробнее о том, как писать правильные динамические библиотеки this is a must-read.

Смежные вопросы

 Смежные вопросы