如何在Android中运行已编译的二进制文件?

时间:2016-01-04 14:13:03

标签: android linux shell gcc cross-platform

我一直试图在我的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。

2 个答案:

答案 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上完成所有工作,这意味着您可以直接在手机上编译代码:)