23

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

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

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

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

如何找出无法运行的可执行文件有什么不同?

我在网上阅读了很多,大多数人都收到了这个错误,要么:

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

或者

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

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

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

送什么?我该如何调试?

4

4 回答 4

24

权限问题。需要重新挂载/tmp。以下命令适用于我(Centos 7):

sudo mount /tmp -o remount,exec

于 2019-04-15T16:23:47.687 回答
20

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

为了解决这个问题,我简单地:

mkdir tmp
export TMPDIR=`pwd`/tmp
于 2017-06-04T07:53:56.973 回答
3

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

于 2014-08-21T18:44:46.947 回答
0

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

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

于 2013-08-20T07:43:39.263 回答