如何在没有可写和可执行段的情况下为 Android O 编译 .so?如何设置特定的ELF权限?
How to compile .so for Android O without Writable and Executable Segments? How to set specific ELF permissions?
目前 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,它可能是一个缺少注释的汇编文件(仅仅是疏忽)。但是可能会出现更晦涩的事情,因此没有通用的解决方案。
但在大多数情况下,不需要对您的项目进行任何更改。
目前 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,它可能是一个缺少注释的汇编文件(仅仅是疏忽)。但是可能会出现更晦涩的事情,因此没有通用的解决方案。
但在大多数情况下,不需要对您的项目进行任何更改。