Сегменты загрузки W + E не разрешены в игре Android - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть один проект Android, который довольно старый.Версия compileSdk - 23. Сейчас я обновляю его до API 28, но при попытке запустить он выдает W+E load segments are not allowed.

В проекте используется библиотека общего доступа под названием libgba.so shared lib, созданная для armeabi, на самом делеAPK построен на API 23 build SDK и такой же armeabi работает на всех устройствах.Проблема заключается только в том, что я обновляю compileSdk, даже если я использую версию API 23 compilSdk в Android-студии, она вылетает без журнала.

1 Ответ

0 голосов
/ 27 сентября 2019

Сегменты не могут быть доступны как для записи, так и для исполнения, начиная с android-26: https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#writable-and-executable-segments-enforced-for-api-level-26

Каждый сегмент в файле ELF имеет связанные флаги, которые сообщают динамическому компоновщику, какие разрешения предоставитьсоответствующая страница в памяти.В целях безопасности данные не должны быть исполняемыми и код не должен быть доступным для записи.Это означает, что флаги W (для записываемых) и E (для исполняемых) должны быть взаимоисключающими.Это не было реализовано исторически, но сейчас.

Рекомендуется использовать следующее для диагностики плохой библиотеки:

$ readelf --program-headers -W libBadFlags.so | grep WE
  LOAD           0x000000 0x00000000 0x00000000 0x4c01d 0x4c01d RWE 0x1000

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...