在Linux ARM上运行Android的ARM二进制文件

时间:2012-07-08 14:17:00

标签: android linux kernel arm

可以在其他具有Linux功能的ARM设备(例如Raspberry Pi)上运行为Android(而非.apk)构建的ARM二进制文件吗?我正在尝试在ARM上移植我的一个项目,但我需要使用一个闭源二进制文件(SopCast),它只适用于x86(Windows和Linux)和(最近)Android设备。

运行file sopclient显示 ELF 32位LSB可执行文件,ARM,版本1(SYSV),动态链接(使用共享库),剥离sh sopclient只是说< em>无法执行二进制文件(是的,我之前是chmoded + x)。

“经典”ARM Linux内核和Android-Linux内核之间是否存在明显差异?

1 个答案:

答案 0 :(得分:12)

请注意,Android的bionic lib可能存在依赖关系,而这可能不存在于另一个Linux ARM上?

您可以通过运行readelf -Ss binary_name来查看符号,如果有,

例如,使用readelf -Ss logwrapper

Symbol table '.dynsym' contains 47 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_unwind_cpp_pr0
     2: 00000000     0 FUNC    GLOBAL DEFAULT  UND strlen
     3: 00000000     0 FUNC    GLOBAL DEFAULT  UND __errno
     4: 00000000     0 FUNC    GLOBAL DEFAULT  UND open
     5: 00000000     0 FUNC    GLOBAL DEFAULT  UND close
     6: 00000000     0 FUNC    GLOBAL DEFAULT  UND __stack_chk_fail
     7: 00000000     0 OBJECT  GLOBAL DEFAULT  UND __stack_chk_guard
     8: 00000000     0 FUNC    GLOBAL DEFAULT  UND pthread_mutex_unlock
     9: 00000000     0 FUNC    GLOBAL DEFAULT  UND pthread_mutex_lock
    10: 00000000     0 FUNC    GLOBAL DEFAULT  UND read
    11: 00000000     0 FUNC    GLOBAL DEFAULT  UND abort
    12: 00000000     0 OBJECT  GLOBAL DEFAULT  UND __sF
    13: 00000000     0 FUNC    GLOBAL DEFAULT  UND memcpy
    14: 00000000     0 FUNC    GLOBAL DEFAULT  UND __libc_init
    15: 00000000     0 FUNC    GLOBAL DEFAULT  UND exit
    16: 0000a170     0 NOTYPE  GLOBAL DEFAULT   19 __dso_handle
    17: 0000a008     0 NOTYPE  GLOBAL DEFAULT   13 __INIT_ARRAY__
    18: 0000a010     0 NOTYPE  GLOBAL DEFAULT   14 __FINI_ARRAY__
    19: 00000000     0 FUNC    GLOBAL DEFAULT  UND setgid
    20: 00000000     0 FUNC    GLOBAL DEFAULT  UND writev
    21: 00000000     0 FUNC    GLOBAL DEFAULT  UND dup2
    22: 00000000     0 FUNC    GLOBAL DEFAULT  UND access
    23: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_unwind_cpp_pr1
    24: 00000000     0 FUNC    GLOBAL DEFAULT  UND memmove
    25: 00000000     0 FUNC    GLOBAL DEFAULT  UND fork
    26: 00000000     0 FUNC    GLOBAL DEFAULT  UND execvp
    27: 00000000     0 FUNC    GLOBAL DEFAULT  UND strncmp
    28: 00000000     0 FUNC    GLOBAL DEFAULT  UND strcmp
    29: 00000000     0 FUNC    GLOBAL DEFAULT  UND ptsname
    30: 00000000     0 FUNC    GLOBAL DEFAULT  UND setuid
    31: 00000000     0 FUNC    GLOBAL DEFAULT  UND strerror
    32: 00000000     0 FUNC    GLOBAL DEFAULT  UND vsnprintf
    33: 00000000     0 FUNC    GLOBAL DEFAULT  UND unlockpt
    34: 00000000     0 FUNC    GLOBAL DEFAULT  UND wait
    35: 00000000     0 FUNC    GLOBAL DEFAULT  UND fputs
    36: 00009318     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_start
    37: 00009368     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_end
    38: 0000a15c     0 NOTYPE  GLOBAL DEFAULT   18 __data_start
    39: 0000a170     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
    40: 0000a170     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
    41: 0000a170     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start__
    42: 0000a188     0 NOTYPE  GLOBAL DEFAULT  ABS _bss_end__
    43: 0000a188     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_end__
    44: 0000a188     0 NOTYPE  GLOBAL DEFAULT  ABS __end__
    45: 0000a188     0 NOTYPE  GLOBAL DEFAULT  ABS _end
    46: 00080000     0 NOTYPE  GLOBAL DEFAULT  ABS _stack

注意使用的符号,这是检查符号的提示,最后发出这个,readelf -d logwrapper

Dynamic section at offset 0x2020 contains 24 entries:
  Tag        Type                         Name/Value
 0x00000003 (PLTGOT)                     0xa0e8
 0x00000002 (PLTRELSZ)                   208 (bytes)
 0x00000017 (JMPREL)                     0x875c
 0x00000014 (PLTREL)                     REL
 0x00000011 (REL)                        0x882c
 0x00000012 (RELSZ)                      16 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000006 (SYMTAB)                     0x8280
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000005 (STRTAB)                     0x8570
 0x0000000a (STRSZ)                      490 (bytes)
 0x00000004 (HASH)                       0x8128
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000020 (PREINIT_ARRAY)              0xa000
 0x00000021 (PREINIT_ARRAYSZ)            0x8
 0x00000019 (INIT_ARRAY)                 0xa008
 0x0000001b (INIT_ARRAYSZ)               8 (bytes)
 0x0000001a (FINI_ARRAY)                 0xa010
 0x0000001c (FINI_ARRAYSZ)               8 (bytes)
 0x0000001e (FLAGS)                      
 0x00000000 (NULL)                       0x0

在运行时动态链接了三个库,事情是,bionic库是libc.so,从原生的C和Android角度来看,所以先仔细检查一下!

还有其他ARM libc.so将以ucLibC为幌子,因此里程可能会有所不同。唯一可以看到的方法是在Linux ARM下运行它以查看会发生什么,如果它因为分段错误或总线错误而爆炸,那么你就会知道。