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

时间:2012-11-21 21:12:59

标签: android linker executable linker-errors dynamic-linking

我有两个可执行文件,它们都是交叉编译的,可以在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 个答案:

答案 0 :(得分:4)

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

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

mkdir tmp
export TMPDIR=`pwd`/tmp

答案 1 :(得分:4)

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

  

sudo安装/ tmp -o重新安装,执行

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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