“未能从共享对象映射段:操作不允许”以及如何调试的可能原因是什么?

问题描述 投票:7回答:4

我有两个可执行文件,它们都是交叉编译的,可以在Android中运行。我已将两者放在同一目录中的设备上。我已将它们所依赖的所有共享库放在同一目录中,包括ld-linux.so.3。我使用以下命令运行可执行文件:

ld-linux.so.3 --library-path / path / to / libraries executable_name

当作为任何用户运行时,它们都适用于旧版Android。如果以root身份运行,两者都可以在最新版本的Android上运行。当以任何用户身份运行时,只有一个可以在最新版本的android上运行。相反,它给出:

无法从共享对象映射段:不允许执行executable_name操作

如何找出不能运行的可执行文件的不同之处?

我在网上看了很多,大多数人都会收到这个错误:

A)没有它们所依赖的库之一或可执行文件本身的执行权限。

要么

B)尝试从作为NOEXEC挂载的目录运行。

这两种情况似乎并非如此。它可以找到所有库,我可以自己加载任何库,看看它依赖于解决的其他东西。此外,我可以从感兴趣的目录运行基本脚本。

较新版本的Android,Jelly Bean,是一个不同的Linux内核版本,我想知道这是否相关。

什么给?我该如何调试?

android linker executable linker-errors dynamic-linking
4个回答
6
投票

许可问题。需要重新安装/ tmp。以下命令适用于我(Centos 7):

sudo mount / tmp -o remount,exec


4
投票

我在不同的上下文中遇到此错误。由于某种原因,它在尝试使用/ tmp文件夹时会导致错误。

要解决这个问题,我只需:

mkdir tmp
export TMPDIR=`pwd`/tmp

2
投票

问题在于如何编译可执行文件。它们需要使用适当支持更新的arm设备的交叉编译器进行编译。我使用的编译器生成的可执行文件只能在arm设备的子集上工作。问题不在于android的不同版本。


0
投票

默认情况下在Android 4.3上启用SELinux,但它应该是“允许的”[0]。也许您的手机供应商添加了更多限制性规则。

[0] https://source.android.com/devices/tech/security/se-linux.html

© www.soinside.com 2019 - 2024. All rights reserved.