dysymtab_commandの中身を調べていたのですが、よくわからない感じだったので後回しにすることにしました。今回はセグメントやセクションの中身の方を調べていきたいとおもいます。
現在すでにわかっているセグメント&セクションの情報はこんな感じでした。
[ 0] : LC_SEGMENT_64 __PAGEZERO vmaddr=0x0000000000000000, vmsize=0x0000000100000000 fileoff=0x0000000000000000, filesize=0x0000000000000000 maxprot=0x00000000, initprot=0x00000000 nSect(s)=0 [ 1] : LC_SEGMENT_64 __TEXT vmaddr=0x0000000100000000, vmsize=0x0000000000001000 fileoff=0x0000000000000000, filesize=0x0000000000001000 maxprot=0x00000007, initprot=0x00000005 nSect(s)=6 section[0] : __TEXT [__text] section[1] : __TEXT [__stubs] section[2] : __TEXT [__stub_helper] section[3] : __TEXT [__cstring] section[4] : __TEXT [__unwind_info] section[5] : __TEXT [__eh_frame] [ 2] : LC_SEGMENT_64 __DATA vmaddr=0x0000000100001000, vmsize=0x0000000000001000 fileoff=0x0000000000001000, filesize=0x0000000000001000 maxprot=0x00000007, initprot=0x00000003 nSect(s)=2 section[0] : __DATA [__nl_symbol_ptr] section[1] : __DATA [__la_symbol_ptr] [ 3] : LC_SEGMENT_64 __LINKEDIT vmaddr=0x0000000100002000, vmsize=0x0000000000001000 fileoff=0x0000000000002000, filesize=0x0000000000000130 maxprot=0x00000007, initprot=0x00000001 nSect(s)=0
セグメントについて
今回の例ではセグメントとして以下のものが含まれていました。
- __PAGEZERO
- __TEXT
- __DATA
- __LINKEDIT
__TEXTセグメントは実行コードと読み込み専用のデータが配置される領域です。__DATAセグメントは読み書き可能なデータが配置される領域です。
一方初めて見るような他のセグメントを調べてみると次のようになっていました。__PAGEZEROセグメントはメモリ1ページを使用し、仮想メモリのゼロ番地となるように配置されるセグメントです。__LINKEDITセグメントはシンボル、文字列、リロケーションテーブルなどがダイナミックリンカが使用する情報が配置されるセグメントです。
セクションについて
今回の例では以下のセクションが含まれていました。
- __text
- __stubs
- __stub_helper
- __cstring
- __unwind_info
- __eh_frame
- __nl_symbol_ptr
- __la_symbol_ptr
__text は実行可能なプログラムコードが格納されているセクションです。
__cstringは文字定数が格納されているセクションです。
__nl_symbol_ptrはNon-lazy symbol pointersの意らしく、__la_symbol_ptrはLazy symbol pointers の意らしいです。従来は __IMPORTセグメント__jump_tableというものがあったようですが、最近は__la_symbol_ptrに変化しているとかいう話です。
今回のサンプルのバイナリデータでは含まれておらず表示されませんでしたが、初期化済みデータが格納される__dataセクションや、未初期化のスタティック変数領域としての__bssセクションといったものもMach-Oバイナリの中に存在します。
セクションの情報の中にはそのセクションの種別&属性を設定しているフラグが存在します。これを表示するようにしてみたものが以下となります。
[ 1] : LC_SEGMENT_64 __TEXT vmaddr=0x0000000100000000, vmsize=0x0000000000001000 fileoff=0x0000000000000000, filesize=0x0000000000001000 maxprot=0x00000007, initprot=0x00000005 nSect(s)=6 section[0] : __TEXT [__text] : addr=0x100000f10, offset=3856, size=45 : align=16, reloff=0, nreloc=0 : resv0=0, resv1=0, resv2=0 : flags=80000400 > S_REGULAR S_ATTR_PURE_INSTRUCTIONS S_ATTR_SOME_INSTRUCTIONS section[1] : __TEXT [__stubs] : addr=0x100000f3e, offset=3902, size=6 : align=2, reloff=0, nreloc=0 : resv0=0, resv1=6, resv2=0 : flags=80000408 > S_SYMBOL_STUBS S_ATTR_PURE_INSTRUCTIONS S_ATTR_SOME_INSTRUCTIONS section[2] : __TEXT [__stub_helper] : addr=0x100000f44, offset=3908, size=26 : align=4, reloff=0, nreloc=0 : resv0=0, resv1=0, resv2=0 : flags=80000400 > S_REGULAR S_ATTR_PURE_INSTRUCTIONS S_ATTR_SOME_INSTRUCTIONS section[3] : __TEXT [__cstring] : addr=0x100000f5e, offset=3934, size=13 : align=1, reloff=0, nreloc=0 : resv0=0, resv1=0, resv2=0 : flags=00000002 > S_CSTRING_LITERALS section[4] : __TEXT [__unwind_info] : addr=0x100000f6b, offset=3947, size=72 : align=1, reloff=0, nreloc=0 : resv0=0, resv1=0, resv2=0 : flags=00000000 > S_REGULAR section[5] : __TEXT [__eh_frame] : addr=0x100000fb8, offset=4024, size=64 : align=8, reloff=0, nreloc=0 : resv0=0, resv1=0, resv2=0 : flags=00000000 > S_REGULAR [ 2] : LC_SEGMENT_64 __DATA vmaddr=0x0000000100001000, vmsize=0x0000000000001000 fileoff=0x0000000000001000, filesize=0x0000000000001000 maxprot=0x00000007, initprot=0x00000003 nSect(s)=2 section[0] : __DATA [__nl_symbol_ptr] : addr=0x100001000, offset=4096, size=16 : align=8, reloff=0, nreloc=0 : resv0=1, resv1=0, resv2=0 : flags=00000006 > S_NON_LAZY_SYMBOL_POINTERS section[1] : __DATA [__la_symbol_ptr] : addr=0x100001010, offset=4112, size=8 : align=8, reloff=0, nreloc=0 : resv0=3, resv1=0, resv2=0 : flags=00000007 > S_LAZY_SYMBOL_POINTERS