【问题标题】:What are possible causes of "failed to map segment from shared object: operation not permitted", and how to debug?“无法从共享对象映射段:不允许操作”的可能原因是什么,以及如何调试?
【发布时间】:2012-11-10 05:30:03
【问题描述】:

我有两个可执行文件,都经过交叉编译以在 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 内核版本,我想知道这是否相关。

送什么?我该如何调试?

【问题讨论】:

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


【解决方案1】:

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

sudo mount /tmp -o remount,exec

【讨论】:

    【解决方案2】:

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

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

    mkdir tmp
    export TMPDIR=`pwd`/tmp
    

    【讨论】:

    • 什么是TMPDIR
    • 它是一个环境变量,我猜有些脚本会用它来查找可以进行簿记的临时目录的位置
    • 这有助于解决一个完全不相关的问题(Python/Anaconda 安装在我无法访问 /tmp 的机器上)。对于在 Android 上下文之外最终遇到此错误的某些人可能有用。 :)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 这个问题出现在 Jelly Bean 的第一个版本上,所以在此更改之前。但是,这是一本有趣的读物。 4.3我用的不多。
      猜你喜欢
      • 2016-06-23
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多