Mach-O セグメントとセクション補足


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
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする