我一直试图在我的Android手机中运行已编译的二进制文件,但它只是一直告诉我"没有这样的文件或目录"。
具体来说,我编译了wificurse,并且正如描述中提到的一个arm命令,显然可以为arm架构编译源代码而不对makefile进行任何更改。所以我做了以下事情:
export CROSS_COMPILE=arm-linux-gnueabi-
make CROSS_COMPILE=arm-linux-gnueabi-
然后使用生成的二进制文件(wificurse),我执行了以下操作:
adb push wificurse /data
在根adb shell中我做了:
root@android:/data # chmod 0777 wificurse
什么都不返回;的工作原理。
root@android:/data # chmod u+x wificurse
退货"坏模式"。
root@android:/data # busybox chmod 077 wificurse
什么都不返回;的工作原理。
root@android:/data # busybox chmod u+x wificurse
什么都不返回;的工作原理。
但是当我尝试用
运行二进制文件时 root@android:/data # ./wificurse
它返回" / system / bin / sh:./ wificurse:没有这样的文件或目录"。 文件夹和二进制文件中的ls确实存在。
已经尝试将二进制文件复制到内部sdcard,然后移动到/ data(甚至尝试/ system / bin和/ system / xbin)并返回"访问被拒绝",但是如果我chmod二进制文件它将返回相同的错误(没有这样的文件或目录)。有人可以帮帮我吗?我已经使用了linux shell 2年多了,尽管我在编程方面完全是一个菜鸟。我想我错过了像工具链这样的东西,我不知道 我正在运行Ubuntu 15.10 x64。
答案 0 :(得分:2)
您的二进制文件显然取决于动态链接不可见的某些共享库(.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可用于动态链接您的二进制文件。)
如果问题仍未解决,您的应用程序会链接到某个系统库的不同版本 - 尝试使用较旧的工具链。
答案 1 :(得分:1)
您是否尝试过此主题中的方法? "No such file or directory" trying to execute linux binary on Android device
解决此问题的另一种方法是在Android上安装KBOX。作者为Android平台开发了gcc,ssh等工具。因此,您可以在手机上启动ssh服务器并在PC上完成所有工作,这意味着您可以直接在手机上编译代码:)