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

cor*_*bin 13 linker executable android linker-errors dynamic-linking

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

什么给?我该如何调试?

vin*_*yll 11

我在其他情况下遇到此错误。由于某些原因,在尝试使用/ tmp文件夹时会导致错误。

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

mkdir tmp
export TMPDIR=`pwd`/tmp
Run Code Online (Sandbox Code Playgroud)

  • 这有助于解决一个完全不相关的问题(在我无法访问 /tmp 的机器上安装 Python/Anaconda)。对于那些在 Android 上下文之外最终遇到此错误的人来说可能很有用。:) (2认同)

小智 9

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

须藤挂载/ tmp -o重新挂载,执行


cor*_*bin 3

问题在于可执行文件的编译方式。它们需要使用正确支持较新的 ARM 设备的交叉编译器进行编译。我使用的编译器生成的可执行文件只能在部分 ARM 设备上运行。问题不在于不同的 Android 版本。