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
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.