8

Linuxを搭載した他のARMデバイス(Raspberry Piなど)でAndroid用に構築されたARMバイナリ(.apkではない)を実行することは可能ですか?プロジェクトの1つをARMに移植しようとしていますが、x86(WindowsおよびLinux)および(最近)Androidデバイスでのみ使用可能なクローズドソースバイナリ(SopCast)を使用する必要があります。

実行中file sopclientは、ELF 32ビットLSB実行可能ファイル、ARM、バージョン1(SYSV)、動的リンク(共有ライブラリを使用)、削除されたものを示していますが、バイナリファイルを実行できないsh sopclientと言っています(はい、以前は+ xを変更しました)。

「クラシック」なARMLinuxカーネルとAndroid-Linuxカーネルの間に顕著な違いはありますか?

4

1 に答える 1

13

bionic別のLinuxARMには存在しない可能性のあるAndroidのlibへの依存関係がある可能性があることに注意してください。

を実行し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

実行時に動的にリンクされる3つのライブラリがあります。つまり、bionicライブラリはlibc.soネイティブのCおよびAndroidの観点からのものであるため、最初にそれを再確認してください。

ucLibClibc.soを装って他のARMが存在するため、マイレージは異なる場合があります。確認する唯一の方法は、Linux ARMで実行して何が起こるかを確認することです。セグメンテーションエラーまたはバスエラーが発生した場合は、そのことがわかります。

于 2012-07-08T15:00:28.973 に答える