在其他具有Linux的ARM设备(如Raspberry Pi)上运行为Android(而不是.apk)构build的ARM二进制文件是可能的? 我试图在ARM上移植我的一个项目,但是我需要使用仅适用于x86(Windows和Linux)和(最近)的Android设备的闭源二进制(SopCast)。
运行file sopclient
显示ELF的32位LSB可执行文件,ARM版本1(SYSV),dynamic链接(使用共享库),剥离,但是sh sopclient
说只是不能执行二进制文件 (是的,我chmoded + x之前)。
“经典”的ARM Linux内核和Android-Linux之间有什么明显的区别吗?
请注意,可能会依赖于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
有三个库在运行时动态链接, libc.so
, bionic
库是从本地C和Android的角度来看libc.so
,所以仔细检查一下!
还有其他的ARM libc.so
将会在ucLibC的伪装下运行,所以里程可能会有所不同。 唯一的办法就是在Linux ARM下运行它,看看会发生什么,如果发生了分割错误或总线错误,你就会知道。