2012-07-08 14 views
7

Możliwe jest uruchamianie binarnego pliku ARM zbudowanego dla systemu Android (nie pliku .apk) na innych urządzeniach ARM z systemem Linux (na przykład Raspberry Pi)? Próbuję przenieść jeden z moich projektów na ARM, ale muszę użyć binarnego kodu źródłowego (SopCast), który jest dostępny tylko dla x86 (Windows i Linux) i (ostatnio) urządzeń z systemem Android.Uruchamianie plików binarnych ARM dla Androida w systemie Linux ARM

Running file sopclient znajdują ELF 32-bit LSB wykonywalne, ramię, wersja 1 (SYSV), dynamicznie powiązane (używa wspólne libs), pozbawiony ale sh sopclient mówi tylko nie może wykonać pliku binarnego (tak, CHMOD + x to wcześniej).

Czy zauważalna jest różnica między "klasycznym" jądrem systemu ARM Linux i systemem Linux?

+0

Czy po prostu próbowałeś go uruchomić jako './Sopclient'? Wygląda na to, że próbujesz uruchomić go za pomocą 'sh', które spróbuje zinterpretować plik jako skrypt powłoki (stąd błąd). – mdm

+0

Uruchamianie jako './Sopclient' mówi * -bash: ./sopclient: Brak takiego pliku lub katalogu *. Ale sopclient znajduje się w bieżącym katalogu i może być wykonywany – ov1d1u

+0

Oprócz problemu z biblioteką systemową (który możesz naprawić za pomocą bibliotek androida w/system/lib i linker w/system/bin), program prawdopodobnie nie będzie nadające się do użytku, chyba że przychodzące i wychodzące interfejsy to te, które można powielić. Po stronie przychodzącej możesz mieć standardowe sieciowe interfejsy API, ale jeśli nie zrzucisz wyników do stdout lub plików strona wychodząca będzie trudna. –

Odpowiedz

12

Należy pamiętać, że mogą istnieć zależności od biblioteki Androida bionic, która może nie być obecna w innym systemie Linux ARM?

można sprawdzić, uruchamiając readelf -Ss binary_name zobaczyć symbole jeśli występują,

Na przykład, używając 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 

zauważy symboli używanych, to sygnał, by sprawdzić symbole wreszcie problem to, 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 

Są trzy biblioteki dynamicznie połączone w czasie wykonywania, jest to, Biblioteka bionic jest libc.so z natywnej perspektywy C i Androida, więc najpierw sprawdź to!

Istnieją inne ARM libc.so, które będą dostępne pod nazwą ucLibC, więc przebieg może się różnić. Jedynym sposobem, aby to zobaczyć, jest uruchomienie go pod Linux ARM, aby zobaczyć, co się stanie, jeśli wyskoczy z błędami segmentacji lub błędami magistrali, będziesz wtedy wiedział.

Powiązane problemy