【问题标题】:How do I run a compiled binary in Android?如何在 Android 中运行已编译的二进制文件?
【发布时间】:2016-04-08 04:18:36
【问题描述】:

我一直在尝试在我的 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: No such file or directory”。 在文件夹中做了一个 ls 并且二进制文件确实在那里。

已经尝试将二进制文件复制到内部 sdcard,然后移动到 /data(甚至尝试过 /system/bin 和 /system/xbin)并返回“拒绝访问”,但如果我对二进制文件进行 chmod,它将返回相同错误(没有这样的文件或目录)。有人可以帮我吗?我已经使用 linux shell 2 年多了,尽管在编程方面我完全是个菜鸟。我想我缺少类似工具链的东西,我不知道。
我正在运行 Ubuntu 15.10 x64。

【问题讨论】:

    标签: android linux shell gcc cross-platform


    【解决方案1】:

    您的二进制文件显然依赖于一些对动态链接不可见的共享库 (.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 可用于与您的二进制文件进行动态链接)。

    如果问题仍未解决,则您的应用程序与某些系统库的不同版本链接 - 尝试使用较旧的工具链。

    【讨论】:

      【解决方案2】:

      你试过这个线程中的方法吗? "No such file or directory" trying to execute linux binary on Android device

      解决此问题的另一种方法是在 Android 上安装 KBOX。作者为Android平台开发了gcc、ssh server等工具。因此,您可以在手机上启动 ssh 服务器,然后在 PC 上完成所有工作,这意味着您可以直接在手机上编译代码:)

      【讨论】:

        猜你喜欢
        • 2023-02-23
        • 1970-01-01
        • 2012-04-09
        • 1970-01-01
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多