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

An *_*Hoa 13 security adb android-ndk

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

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

到ARMv7a可执行文件,比如hello使用Android NDK,然后在Android shell中运行它.我曾尝试的方法在网络上提出诸如推可执行文件/data/local通过

adb push hello /data/local
Run Code Online (Sandbox Code Playgroud)

更改允许执行的权限

adb shell chmod 755 /data/local/hello
Run Code Online (Sandbox Code Playgroud)

然后使用在shell中调用它们

adb shell /data/local/hello
Run Code Online (Sandbox Code Playgroud)

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

/data/local/hello: not found
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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

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

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