我如何 运行 在 Android 中编译二进制文件?
How do I run a compiled binary in Android?
我一直在尝试 运行 在我的 android phone 中编译二进制文件,但它一直告诉我 "No such file or directory".
具体来说,我编译了wificurse,并且由于描述中提到了一个arm命令,很明显可以为arm架构编译源代码而无需对makefile进行任何更改。所以我做了以下事情:
export CROSS_COMPILE=arm-linux-gnueabi-
make CROSS_COMPILE=arm-linux-gnueabi-
然后使用生成的二进制文件 (wificurse),我执行了以下操作:
adb push wificurse /data
在 root adb 中 shell 我做了:
root@android:/data # chmod 0777 wificurse
Returns 没有;有效。
root@android:/data # chmod u+x wificurse
Returns"Bad Mode"。
root@android:/data # busybox chmod 077 wificurse
Returns 没有;有效。
root@android:/data # busybox chmod u+x wificurse
Returns 没有;有效。
但是当我尝试 运行 带有
的二进制文件时
root@android:/data # ./wificurse
它 returns “/system/bin/sh: ./wificurse: 没有那个文件或目录”。
在文件夹中执行 ls,二进制文件确实存在。
已经尝试将二进制文件复制到内部 sdcard,然后移动到 /data(甚至尝试了 /system/bin 和 /system/xbin)并且它 returns "Access denied",但是如果我对二进制文件进行 chmod,它将 return 出现相同的错误(没有这样的文件或目录)。有人可以帮我吗?我已经使用 linux shell 2 年多了,尽管在编程方面我完全是个菜鸟。我想我缺少工具链之类的东西,我不知道。
我是 运行宁 Ubuntu 15.10 x64.
你试过这个帖子里的方法了吗?
"No such file or directory" trying to execute linux binary on Android device
解决此问题的另一种方法是在 Android 上安装 KBOX。作者为Android平台开发了gcc、ssh server等工具。因此,您可以在 phone 上启动一个 ssh 服务器,并在您的 PC 上完成所有工作,这意味着您可以直接在 phone 上编译代码 :)
您的二进制文件显然依赖于一些动态链接不可见的共享库 (.so)。您可以使用工具链中的 readelf
,您会得到如下内容:
tom@pc:~/workspace/test/arm-v7a_android9/release$ ~/toolchains/armeabiv7a_android-9_ndk-r10e_gcc-4.9/bin/arm-linux-androideabi-readelf -d test
Dynamic section at offset 0x445a14 contains 27 entries:
Tag Type Name/Value
0x00000003 (PLTGOT) 0x44fc50
0x00000002 (PLTRELSZ) 1864 (bytes)
0x00000017 (JMPREL) 0x74d24
0x00000014 (PLTREL) REL
0x00000011 (REL) 0x74cd4
0x00000012 (RELSZ) 80 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x00000015 (DEBUG) 0x0
0x00000006 (SYMTAB) 0x8148
0x0000000b (SYMENT) 16 (bytes)
0x00000005 (STRTAB) 0x26718
0x0000000a (STRSZ) 273460 (bytes)
0x00000004 (HASH) 0x6934c
0x00000001 (NEEDED) Shared library: [liblog.so]
0x00000001 (NEEDED) Shared library: [libm.so]
0x00000001 (NEEDED) Shared library: [libc.so]
0x00000001 (NEEDED) Shared library: [libdl.so]
0x0000001a (FINI_ARRAY) 0x447cb8
0x0000001c (FINI_ARRAYSZ) 12 (bytes)
0x00000019 (INIT_ARRAY) 0x447cc4
0x0000001b (INIT_ARRAYSZ) 324 (bytes)
0x00000020 (PREINIT_ARRAY) 0x447e08
0x00000021 (PREINIT_ARRAYSZ) 0x8
0x0000001e (FLAGS) BIND_NOW
0x6ffffffb (FLAGS_1) Flags: NOW
0x00000000 (NULL) 0x0
检查类型为 (NEEDED)
的所有库是否都在您的 Android 设备上并且对您的二进制文件可见(您应该使用 export LD_LIBRARY_PATH=<path>[:<another_path>[..]]
使 .so 可用于与您的动态链接二进制)。
如果问题仍未解决,则您的应用程序与某些系统库的不同版本相关联 - 尝试使用较旧的工具链。
我一直在尝试 运行 在我的 android phone 中编译二进制文件,但它一直告诉我 "No such file or directory".
具体来说,我编译了wificurse,并且由于描述中提到了一个arm命令,很明显可以为arm架构编译源代码而无需对makefile进行任何更改。所以我做了以下事情:
export CROSS_COMPILE=arm-linux-gnueabi-
make CROSS_COMPILE=arm-linux-gnueabi-
然后使用生成的二进制文件 (wificurse),我执行了以下操作:
adb push wificurse /data
在 root adb 中 shell 我做了:
root@android:/data # chmod 0777 wificurse
Returns 没有;有效。
root@android:/data # chmod u+x wificurse
Returns"Bad Mode"。
root@android:/data # busybox chmod 077 wificurse
Returns 没有;有效。
root@android:/data # busybox chmod u+x wificurse
Returns 没有;有效。
但是当我尝试 运行 带有
的二进制文件时 root@android:/data # ./wificurse
它 returns “/system/bin/sh: ./wificurse: 没有那个文件或目录”。 在文件夹中执行 ls,二进制文件确实存在。
已经尝试将二进制文件复制到内部 sdcard,然后移动到 /data(甚至尝试了 /system/bin 和 /system/xbin)并且它 returns "Access denied",但是如果我对二进制文件进行 chmod,它将 return 出现相同的错误(没有这样的文件或目录)。有人可以帮我吗?我已经使用 linux shell 2 年多了,尽管在编程方面我完全是个菜鸟。我想我缺少工具链之类的东西,我不知道。
我是 运行宁 Ubuntu 15.10 x64.
你试过这个帖子里的方法了吗? "No such file or directory" trying to execute linux binary on Android device
解决此问题的另一种方法是在 Android 上安装 KBOX。作者为Android平台开发了gcc、ssh server等工具。因此,您可以在 phone 上启动一个 ssh 服务器,并在您的 PC 上完成所有工作,这意味着您可以直接在 phone 上编译代码 :)
您的二进制文件显然依赖于一些动态链接不可见的共享库 (.so)。您可以使用工具链中的 readelf
,您会得到如下内容:
tom@pc:~/workspace/test/arm-v7a_android9/release$ ~/toolchains/armeabiv7a_android-9_ndk-r10e_gcc-4.9/bin/arm-linux-androideabi-readelf -d test
Dynamic section at offset 0x445a14 contains 27 entries:
Tag Type Name/Value
0x00000003 (PLTGOT) 0x44fc50
0x00000002 (PLTRELSZ) 1864 (bytes)
0x00000017 (JMPREL) 0x74d24
0x00000014 (PLTREL) REL
0x00000011 (REL) 0x74cd4
0x00000012 (RELSZ) 80 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x00000015 (DEBUG) 0x0
0x00000006 (SYMTAB) 0x8148
0x0000000b (SYMENT) 16 (bytes)
0x00000005 (STRTAB) 0x26718
0x0000000a (STRSZ) 273460 (bytes)
0x00000004 (HASH) 0x6934c
0x00000001 (NEEDED) Shared library: [liblog.so]
0x00000001 (NEEDED) Shared library: [libm.so]
0x00000001 (NEEDED) Shared library: [libc.so]
0x00000001 (NEEDED) Shared library: [libdl.so]
0x0000001a (FINI_ARRAY) 0x447cb8
0x0000001c (FINI_ARRAYSZ) 12 (bytes)
0x00000019 (INIT_ARRAY) 0x447cc4
0x0000001b (INIT_ARRAYSZ) 324 (bytes)
0x00000020 (PREINIT_ARRAY) 0x447e08
0x00000021 (PREINIT_ARRAYSZ) 0x8
0x0000001e (FLAGS) BIND_NOW
0x6ffffffb (FLAGS_1) Flags: NOW
0x00000000 (NULL) 0x0
检查类型为 (NEEDED)
的所有库是否都在您的 Android 设备上并且对您的二进制文件可见(您应该使用 export LD_LIBRARY_PATH=<path>[:<another_path>[..]]
使 .so 可用于与您的动态链接二进制)。
如果问题仍未解决,则您的应用程序与某些系统库的不同版本相关联 - 尝试使用较旧的工具链。