【问题标题】:Run native ARM executable on Jelly Bean在 Jelly Bean 上运行本机 ARM 可执行文件
【发布时间】:2012-09-19 14:40:07
【问题描述】:

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

// hello.c
#include <stdio.h>
int main() {
    printf("Hello world");
}

到 ARMv7a 可执行文件,使用 Android NDK 说 hello,然后在 Android shell 中运行它。我尝试了网络上建议的方法,例如将可执行文件推送到/data/local by

adb push hello /data/local

更改权限以允许其执行

adb shell chmod 755 /data/local/hello

然后在 shell 中使用

调用它们
adb shell /data/local/hello

最后一步失败并出现错误:

/data/local/hello: not found

但显然文件在那里。我怀疑问题在于 Jelly Bean 的外壳不再允许执行 alien 二进制文件。谁能证实这一点并给我一个解决方案?

【问题讨论】:

  • 这不是我所看到的 Android 编程问题。我相信这会引起 Android 核心用户的兴趣。
  • @Chahk 谢谢。然而,我不认为它回答了我原来的问题。最终,我想通过交叉编译或使用 ARM 预构建版本来运行像“dd”这样的程序。现在我回想起“busybox”和“kbox”,它们也在系统上安装了新的二进制文件,所以我相信这里没有安全问题。我会检查这些工作,看看他们是如何做到的。
  • @Chahk - 鉴于堆栈溢出问题是从 2011 年 10 月开始的,因此是针对未指定的旧版本 Android 的,Jelly Bean 的答案可能会有所不同。发问者真的只是想让某人确认是否是,这是一个关于 Android 的实用可回答问题。
  • @MarkBooth 很公平。为了记录,我没有投票结束。很想知道这个问题的答案。
  • 你能用它们的路径调用二进制文件吗?例如,/system/bin/ls 是否有效?

标签: security android-ndk adb


【解决方案1】:

如果您想在 Android 中运行原生 ARM 二进制文件,您必须使用 -static 进行编译。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我通过安装谷歌的NDK独立工具链并用它重新编译源代码解决了这个问题。工具链应该在幕后做一些神秘的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2011-06-09
    • 2014-04-01
    • 2023-02-14
    相关资源
    最近更新 更多