2012-07-08 47 views
7

Es ist möglich, eine ARM-Binärdatei für Android (nicht die .apk) auf anderen ARM-Geräten mit Linux (z. B. Raspberry Pi) zu verwenden? Ich versuche, eines meiner Projekte auf ARM zu portieren, aber ich muss eine Closed-Source-Binärdatei (SopCast) verwenden, die nur für x86-Geräte (Windows und Linux) und (kürzlich) Android-Geräte verfügbar ist.Ausführen von ARM-Binärdateien für Android unter Linux ARM

Lauf file sopclient zeigt ELF 32-Bit-LSB ausführbar, ARM, Version 1 (SYSV), dynamisch gelinkt (verwendet den gemeinsamen libs), gestrippt aber sh sopclient sagt nur nicht Binärdatei ausführen kann (ja, ich CHMOD + x es vorher).

Gibt es einen erkennbaren Unterschied zwischen einem "klassischen" ARM-Linux-Kernel und einem Android-Linux-Kernel?

+0

Haben Sie gerade versucht, es als './Sopclient' auszuführen? Es sieht so aus, als ob Sie versuchen, es mit 'sh' auszuführen, was die Datei als Shell-Skript interpretieren würde (daher der Fehler). – mdm

+0

läuft als './Sopclient' sagt * -bash: ./sopclient: Keine solche Datei oder Verzeichnis *. Aber sopclient ist im aktuellen Verzeichnis und ist ausführbar – ov1d1u

+0

Zusätzlich zu der Systembibliothek Problem (die Sie möglicherweise mit Android-Bibliotheken in einem/system/lib und Linker in/system/bin beheben können), ist das Programm unwahrscheinlich verwendbar, es sei denn, es handelt sich um eingehende und ausgehende Schnittstellen, die Sie duplizieren können. Auf der eingehenden Seite haben Sie möglicherweise Standard-Netzwerk-APIs, aber wenn die Ergebnisse nicht nach stdout oder Dateien ausgegeben werden, wird die ausgehende Seite eine Herausforderung darstellen. –

Antwort

12

Beachten Sie, dass es möglicherweise Abhängigkeiten von der bionic-Lib des Android gibt, die möglicherweise nicht auf einem anderen Linux-ARM vorhanden ist?

können Sie überprüfen, ob ein readelf -Ss binary_name, indem Sie die Symbole, wenn überhaupt,

Zum Beispiel, um zu sehen, mit 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 

Beachten Sie die Symbole verwendet, das ist Ihr Stichwort um die Symbole zu überprüfen, schließlich Ausgabe dazu 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 

Es gibt drei Bibliotheken dynamisch zur Laufzeit gebunden in, was ist, bionic Bibliothek ist libc.so aus der nativen C-und Android-Perspektive, also überprüfen Sie zuerst, dass zuerst!

Es gibt andere ARM libc.so, die unter dem Deckmantel ucLibC kommen, so dass die Laufleistung variieren kann. Man kann es nur sehen, wenn man es unter dem Linux ARM ausführt, um zu sehen, was passiert, wenn es mit Segmentierungsfehlern oder Busfehlern bombardiert wird, dann weiß man es.

Verwandte Themen