首页 > 解决方案 > Android 游戏中不允许使用 W+E 加载段

问题描述

我有一个相当古老的 Android 项目。compileSdk 版本是 23。现在我将它升级到 API 28,但是W+E load segments are not allowed当我尝试运行时它会给出。

项目正在使用名为libgba.soshared lib 的共享库,该库armeabi实际上是为基于 API 23 构建 SDK 构建的 APK 构建的,并且armeabi在所有设备上都适用。问题只是当我升级 compileSdk 时,即使我在 Android Studio 中使用 API 23 compileSdk 版本,它也会崩溃而没有日志。

标签: javaandroidandroid-ndk

解决方案


自 android-26 以来,段不允许既可写又可执行:https ://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#writable-and-可执行段强制执行 api-level-26

ELF 文件中的每个段都有相关的标志,这些标志告诉动态链接器在内存中授予相应页面的权限。为了安全起见,数据不应该是可执行的,代码也不应该是可写的。这意味着 W(可写)和 E(可执行)标志应该是互斥的。这在历史上不是强制执行的,但现在是强制执行的。

它建议使用以下方法来诊断坏库:

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

项目中可能有一个链接器脚本导致生成有问题的段,并且需要将其修复为可写或可执行,而不是两者。这可能意味着应用程序的代码也需要更改以根据需要更改段的权限。


推荐阅读