Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running ARM binaries for Android on Linux ARM

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 but I need to use a closed-source binary (SopCast) which is available only for x86 (Windows and Linux) and (recently) Android devices.

Running file sopclient shows ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped but sh sopclient says just cannot execute binary file (yes, I chmoded +x it before).

Is there any noticeable difference between a "classic" ARM Linux kernel and a Android-Linux one?

like image 204
ov1d1u Avatar asked Jul 08 '12 14:07

ov1d1u


1 Answers

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.

like image 193
t0mm13b Avatar answered Nov 16 '22 22:11

t0mm13b