如何在没有可写和可执行段的情况下为 Android O 编译 .so?如何设置特定的ELF权限?

How to compile .so for Android O without Writable and Executable Segments? How to set specific ELF permissions?

https://android.googlesource.com/platform/bionic/+/master/android-changes-for-ndk-developers.md#Writable-and-Executable-Segments-Enforced-for-API-level-26

目前 Android O Preview 4 由于具有可写和可执行段而阻止加载某些本机库。他们通过对 ELF 进行扫描来确定这一点。

我正在尝试为 Android 编译一个没有此类可写和可执行段的本机共享对象库。

对这种低级编译不是很熟悉,谁能解释一下如何将段设置为在可写和可执行权限方面正确互斥?

我想我可能需要在我的 Android.mk 文件中添加一些特定的标志来防止这个问题,其他初步想法认为这可能与用于编译的 NDK 工具链有关。

如能提供有关查找位置的任何帮助或建议,我们将不胜感激。

GNU 工具链和 Android 工具链长期以来一直在做正确的事情。可以使用文章中的readelf/grep命令:

$ readelf --program-headers -W libBadFlags.so | grep WE

如果没有输出,应该没问题。如果有is输出,则需要追查writable/executable映射的来源。对于 GNU_STACK header,它可能是一个缺少注释的汇编文件(仅仅是疏忽)。但是可能会出现更晦涩的事情,因此没有通用的解决方案。

但在大多数情况下,不需要对您的项目进行任何更改。