忍者ブログ

Azukish

消えゆく世界と流れる未来に最後の灯を since 2006/4/3

2024/04/26

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

2015/02/19

androidのライブラリをバイナリエディタでいじる前に欲しい物。

P-01Dという端末にCyanogenmodを入れて遊んでおります。
現在のCM9ではカメラをそのままでは使うことができません。
で、そのときに便利だと思ったコマンド類をちょいとばかし紹介します。
あと愚痴と現状。




で、Ginger BreadのPonyoCameraをそのまま移植してみました。

(1)Camera HALが無い
(2)libcamera.soを移植
(3)なんちゃら.soが無いなんとかっていうライブラリ関数がないなんちゃらくぁwせdrftgyふじこlp
(4)それらを移植(コンフリクト起こす奴はLib〜に名前変更)
(5)Lib〜に名称変更した奴はバイナリエディタ使ってその部分を変更する@全ての移植ライブラリ

で、一応、一瞬だけ起動するようにはなったのですが、
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Fail to connect to camera service
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
と言われてみたり、SIGSEGVを頂いたりして(しかも実行するたびに変わるとかw)、ちょっとこのままではこれ以上は自分の力では無理っぽいですorz

なので、ライブラリ関数とか、そのへんで有効そうなのを紹介しときます。

Android NDK

コイツの中にあるndk-dependsは、そのライブラリが依存している外部ライブラリを洗い出すことができます。
↓こんな感じで使います。
$ ndk-depends libc.so
libc.so
libdl.so
この例だとlibc.soはlibdl.soに依存してるらしいですね。

cat

お前は何を言ってるんだ、とか言われてしまいそうですが、猫さんには実にお世話になりました。onekoかわいいよoneko
〇〇っていうライブラリ関数的な何かが足りないと言われた時に、ファイル名が不明で困るということがしばしばあります。
そこで、catを次のように使ってやります。
$ cat libc.so | strings | grep printf
snprintf
fprintf
vsnprintf
asprintf
vfprintf
printf
sprintf
vasprintf
vprintf
vsprintf
vswprintf
vfwprintf
vwprintf
swprintf
wprintf
fwprintf
vfdprintf
fdprintf
こんな感じでprintfにまつわるライブラリ関数的なsomethingをみんな割り出してくれました。
stringとか初めて見たわwwというタコです。マジゴメソ。

readelf

今回の本題です。
↑のcatの利点を全てふっ飛ばしてしまうようなものを発見しました。
それがreadelfです。fedoraだとbinutilsパッケージに入ってます。
readelfを使えば、ライブラリの情報を色々と見ることができるようです。
例えば、libc.soのヘッダ情報を見たければ、
$ readelf -h libc.so
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          52 (bytes into file)
  Start of section headers:          273120 (bytes into file)
  Flags:                             0x5000000, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         6
  Size of section headers:           40 (bytes)
  Number of section headers:         22
  Section header string table index: 21
こんな感じで見れます。

今回はどんなライブラリ関数があるのか知りたかったので、
$ readelf -s libc.so | grep FUNC
     1: 0001009c    12 FUNC    GLOBAL DEFAULT    7 __get_thread
     2: 0000e954     8 FUNC    GLOBAL DEFAULT    7 __aeabi_unwind_cpp_pr0
     3: 000100a8    28 FUNC    GLOBAL DEFAULT    7 __get_stack_base
     4: 000100c4    48 FUNC    GLOBAL DEFAULT    7 pthread_attr_init
     5: 000100f4    60 FUNC    GLOBAL DEFAULT    7 pthread_attr_setdetachsta
・・・
こんなふうにすればよいと。
ldd for Android: lddコマンドのようにライブラリ情報を表示 | ナレッジデザイン大竹のホームページ (by drupal)
とか見ると他にも有用なコマンド群がNDKのツールチェインに含まれてそうですね。
いやあ、これで少しははかどる、かな?

拍手

コメント













カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

アーカイブ

AD

Azkishはamazon.co.jpを宣伝しリンクすることによって サイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。