突然消失するかもしれないブログ

”とつきえブログ”

Androidのネイティブ実行 その2

Debian lennyのネイティブの実行バイナリでは、/lib/ld-linux.so.3というリンカが使われています。ところが、Androidのネイティブの実行バイナリでは、/system/bin/linkerという独自のリンカが使われています。

これはELFのプログラムヘッダを参照することで確認できます。

readelf -l /system/xbin/sqlite3

Elf file type is EXEC (Executable file)
Entry point 0x9150
There are 6 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align

  INTERP         0x0000f4 0x000080f4 0x000080f4 0x00013 0x00013 R   0x1
     [Requesting program interpreter: /system/bin/linker]

また、Android SDK 1.0 R1のemulator.exeが使用しているファームウェアからネイティブの実行バイナリを抜き出してきて、lddを実行しても依存しているDLL、ダイナミックリンクライブラリが表示されません。

そこで、ELFのダイナミックセクションを参照してみます。

readelf -d sqlite3

Dynamic section at offset 0x6044 contains 24 entries:
  Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [libsqlite.so]
0x00000001 (NEEDED)                     Shared library: [libc.so]
0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
0x00000001 (NEEDED)                     Shared library: [libm.so]

すると、libc.so, libstdc++.so, libm.soがリンクされていることがわかります。

次に気になる、DalvikVMのダイナミックセクションを覗いてみます。

readelf -d dalvikvm

Dynamic section at offset 0x1020 contains 26 entries:
  Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [libdvm.so]
0x00000001 (NEEDED)                     Shared library: [libssl.so]
0x00000001 (NEEDED)                     Shared library: [libz.so]
0x00000001 (NEEDED)                     Shared library: [libc.so]
0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
0x00000001 (NEEDED)                     Shared library: [libm.so]

すると、libdvm.so, libssl.so, libz.so, libc.so, libstdc++.so, libm.soというDLLをリンクしていることがわかります。

ちなみに、Debian lennyで、lddを実行した結果と、readelfした結果を比べてみます。すると、以下の赤い部分がreadelfでは表示されません。

lddコマンドは、指定したプログラムがリンクしているDLLが更にリンクしているDLLまで表示してくれるようです。

ldd /bin/ls

librt.so.1 => /lib/librt.so.1 (0x40026000)
libselinux.so.1 => /lib/libselinux.so.1 (0x40035000)
libacl.so.1 => /lib/libacl.so.1 (0x40054000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40062000)
libc.so.6 => /lib/libc.so.6 (0x40076000)
libpthread.so.0 => /lib/libpthread.so.0 (0x4019d000)
/lib/ld-linux.so.3 (0x40000000)
libdl.so.2 => /lib/libdl.so.2 (0x401bb000)
libattr.so.1 => /lib/libattr.so.1 (0x401c6000)

readelf -d /bin/ls

Dynamic section at offset 0x1500c contains 28 entries:
  Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library: [librt.so.1]
0x00000001 (NEEDED)                     Shared library: [libselinux.so.1]
0x00000001 (NEEDED)                     Shared library: [libacl.so.1]
0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。