Security 在Jelly Bean上运行本机ARM可执行文件

Security 在Jelly Bean上运行本机ARM可执行文件,security,android-ndk,adb,Security,Android Ndk,Adb,我正在寻找在Android 4.1(Jelly Bean)上运行本机ARM可执行文件的方法。例如,编译经典的C程序 // hello.c #include <stdio.h> int main() { printf("Hello world"); } 更改权限以允许由执行 adb shell chmod 755 /data/local/hello 然后在shell中使用 adb shell /data/local/hello 最后一步失败,出现错误: /data/loc

我正在寻找在Android 4.1(Jelly Bean)上运行本机ARM可执行文件的方法。例如,编译经典的C程序

// hello.c
#include <stdio.h>
int main() {
    printf("Hello world");
}
更改权限以允许由执行

adb shell chmod 755 /data/local/hello
然后在shell中使用

adb shell /data/local/hello
最后一步失败,出现错误:

/data/local/hello: not found

但很明显,文件就在那里。我怀疑问题在于Jelly Bean的外壳不再允许执行外星二进制文件。有人能确认这一点并给我一个解决方案吗?

检查adb push是否正在转储“权限被拒绝”错误。通过运行以下命令检查文件是否存在:adb shell ls/data/local


由于我更新到4.0.4,我无法访问/data/local,只能访问/data/local/tmp,这可以解释“未找到”错误。

如果你想在Android中运行本机ARM二进制文件,你必须使用-static编译

您用来构建的libc(如果使用标准的ARM工具链而不是Android NDK)与Android的libc(仿生)不同,因此当您的二进制文件打算在目标上动态链接到libc时,它不会,因为libc在目标上不存在


使用-static选项,您可以在构建时从libc链接所需的内容,而不必担心动态链接的问题。

就我所见,这不是Android编程的问题。我相信这会引起Android核心用户的兴趣。@Chahk谢谢。然而,我不认为它回答了我最初的问题。最终,我希望通过交叉编译或使用ARM预构建版本来运行像“dd”这样的程序。现在我想起了“busybox”和“kbox”,它们也在系统上安装了新的二进制文件,所以我相信这里没有安全问题。我会检查一下这些工作,看看他们是如何做到的。@Chahk-鉴于堆栈溢出问题是从2011年10月开始的,因此是针对一个未指明的旧版本的Android,对于Jelly Bean的答案可能会有所不同。提问者真的只是希望有人确认是否是,这是一个关于Android的实用的回答问题。@MarkBooth很公平。为了记录在案,我没有投票结束。我很想知道答案。你能用二进制文件的路径调用它们吗?例如,
/system/bin/ls
有效吗?我通过安装Google的NDK独立工具链并用它重新编译源代码来解决这个问题。工具链在引擎盖下应该有一些神秘的事情。
/data/local/hello: not found