Running ARM binaries for Android on Linux ARM

前端 未结 1 1519
眼角桃花
眼角桃花 2021-02-15 10:35

It is possible to run an ARM binary built for Android (not the .apk) on other ARM devices featuring Linux (such is Raspberry Pi)? I\'m trying to port one of my projects on ARM b

1条回答
  •  伪装坚强ぢ
    2021-02-15 11:21

    Be aware that there could be dependencies on the Android's bionic lib which may not be present on another Linux ARM?

    You can check that by running a readelf -Ss binary_name to see the symbols if any,

    For example, using 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
    

    Notice the symbols used, that's your cue to check the symbols, finally issue this, 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
    

    There's three libraries dynamically linked in at run-time, thing is, bionic library is libc.so from the native C and Android perspective, So double check on that first!

    There are other ARM libc.so that will come under the guise of ucLibC so the mileage may vary. Only way to see, is to run it under the Linux ARM to see what happens, if it bombs out with segmentation errors or bus errors, you'll know then.

    0 讨论(0)
提交回复
热议问题