2012-07-08 27 views
7

Có thể chạy một mã nhị phân ARM được tạo cho Android (không phải .apk) trên các thiết bị ARM khác có tính năng Linux (chẳng hạn như Raspberry Pi)? Tôi đang cố gắng để cổng một trong những dự án của tôi trên ARM nhưng tôi cần phải sử dụng một mã nguồn đóng nhị phân (SopCast) mà chỉ có sẵn cho x86 (Windows và Linux) và (gần đây) thiết bị Android.Chạy các tệp nhị phân ARM cho Android trên Linux ARM

Chạy file sopclient cho thấy ELF 32-bit LSB thực thi, (libs sử dụng được chia sẻ) ARM, phiên bản 1 (SYSV), liên kết động, tước nhưng sh sopclient nói chỉ không thể thực thi nhị phân tập (vâng, tôi chmoded + x nó trước).

Có sự khác biệt đáng chú ý nào giữa lõi ARM Linux "cổ điển" và Android-Linux không?

+0

Bạn vừa thử chạy nó dưới dạng './Sopclient'? Có vẻ như bạn đang cố gắng chạy nó với 'sh', điều này sẽ cố gắng diễn giải tệp dưới dạng tệp shell (do đó là lỗi). – mdm

+0

Chạy dưới dạng './Sopclient' nói * -bash: ./sopclient: Không có tệp hoặc thư mục nào *. Nhưng sopclient nằm trong thư mục hiện hành và có thể thực hiện được – ov1d1u

+0

Ngoài vấn đề thư viện hệ thống (bạn có thể sửa lỗi với thư viện android trong/system/lib và linker trong/system/bin), chương trình không thể có thể sử dụng trừ khi giao diện đến và đi là những giao diện bạn có thể sao chép. Ở phía bên bạn có thể có các API mạng tiêu chuẩn, nhưng trừ khi nó kết xuất các kết quả đến stdout hoặc các tập tin, bên gửi đi sẽ là một thách thức. –

Trả lời

12

Xin lưu ý rằng có thể có các phụ thuộc trên bionic lib của Android có thể không có trên một ARM Linux khác?

Bạn có thể kiểm tra bằng cách chạy một readelf -Ss binary_name để xem những biểu tượng nếu có,

Ví dụ, sử dụng 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 

Chú ý những biểu tượng được sử dụng, đó là gợi ý của bạn để kiểm tra những biểu tượng, cuối cùng vấn đề này, 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 

có ba thư viện liên kết động trong lúc chạy-thời gian, điều, Thư viện bioniclibc.so từ góc độ gốc C và Android, Vì vậy hãy kiểm tra kỹ lần đầu tiên đó!

Có các ARM libc.so khác sẽ nằm dưới vỏ bọc ucLibC để số dặm có thể thay đổi. Chỉ có cách để xem, là để chạy nó dưới Linux ARM để xem những gì sẽ xảy ra, nếu nó bom ra với lỗi phân đoạn hoặc lỗi xe buýt, bạn sẽ biết sau đó.

Các vấn đề liên quan