2012-07-08 5 views
7

Linux (Raspberry Pi와 같은)를 갖춘 다른 ARM 장치에서 Android 용으로 빌드 된 ARM 바이너리 (.apk 제외)를 실행할 수 있습니까? ARM에서 내 프로젝트 중 하나를 이식하려고하지만 x86 (Windows 및 Linux) 및 (최근에) Android 장치에서만 사용할 수있는 폐쇄 형 소스 바이너리 (SopCast)를 사용해야합니다.Linux에서 Android 용 ARM 바이너리 실행 ARM

file sopclient 보여줍니다 실행 ELF 32 비트 LSB 실행, ARM, 버전 1 (SYSV), 동적 링크 (공유 사용합니다 libs와), 그래, 나는 chmoded ( 제거하지만 sh sopclient 그냥 바이너리 파일을 실행할 수 없다고 + X 그것 전에).

"기존"ARM Linux 커널과 Android-Linux 커널간에 눈에 띄는 차이점이 있습니까?

+0

'./sopclient'로 실행 해 보셨습니까? 쉘 스크립트로 파일을 해석하려고 시도하는'sh'로 실행하려고하는 것 같습니다 (따라서 오류). – mdm

+0

'./sopclient '로 실행하면 * -bash : ./sopclient : No such file or directory *가 표시됩니다. 하지만 sopclient가 현재 디렉토리에 있고 실행 가능합니다 – ov1d1u

+0

시스템 라이브러리 문제 (/ system/lib의 안드로이드 라이브러리 및/system/bin의 링커로 수정할 수 있음) 이외에 프로그램이있을 가능성은 거의 없습니다 들어오고 나가는 인터페이스가 복제 할 수있는 인터페이스가 아니면 사용할 수 있습니다. 수신 측에서는 표준 네트워크 API를 사용할 수 있지만, 결과를 stdout 또는 파일에 덤프하지 않으면 나가는 쪽이 어려울 것입니다. –

답변

12

다른 Linux ARM에 없을 수있는 Android bionic lib에 종속 될 수 있다는 점에 유의하십시오. 기호를 사용 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 -Ss binary_name을 실행하여 기호있는 경우 볼 것을 확인할 수 있습니다, 예를 들어

는 그 기호를 확인하는 당신의 큐, 마지막으로 문제의 이 동적으로 런타임에 링크 된 세 개의 도서관, 일이 거기 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 네이티브 C 및 Android 관점에서 볼 수 있으므로 먼저 확인하십시오.

ucLibC으로 보이는 다른 ARM libc.so도 있습니다. 따라서 마일리지가 다를 수 있습니다. 볼 수있는 유일한 방법은 Linux ARM에서 실행하여 어떤 일이 발생 하는지를 세그먼테이션 오류 또는 버스 오류로 폭파하면 알 수 있습니다.