Mach-Oのsegmentコマンドのmaxprot, initprotフィールドについて
どういう記事か
Mach-Oというファイル形式で使われている segment
コマンドの maxprot
, initprot
というフィールドはそれぞれ何を表しているのか分からなかったので自分なりに調べたメモです。
めちゃくちゃニッチな領域なので興味ある人ほとんどいないとは思いますが、詳しい人に見つけてもらえる幸運に期待して記事にします。
本文
Mach-Oフォーマットの、segment
ロードコマンド (segment_command_64
構造体)の maxprot
, initprot
について、よく分からなかったので調べた。
Appleの定義には、 maximum VM protection とか、initial VM protectionとか書いてあったけど、何のこっちゃという感じ。
試しに作っていた minimal.o というオブジェクトファイルでは、どちらも 7
になっていた。
で、調べていたら、 otoolによる出力結果で面白いものを見つけた。
実行コマンドは以下。
$ otool -l -v minimal.o
-l
はロードコマンド一覧を出力するオプション、 -v
はverbose出力のオプション。
で、この出力結果を見ると、値が 7
ではなく、 rwx
となっていた(!!)
file systemとかで使われてるあの表現だ!!
つまりread, write, executeの権限を表しているっぽい。
疑問
nasm, gas, gccそれぞれの出力するオブジェクトファイルを調べてみたところ、どれも 7
(rwx)になっていた。
オブジェクトファイルでは 常にそうしなければいけないのだろうか?
それともオブジェクトファイルでは ここの値は何でもいいのだろうか?
(オブジェクトファイルでは、容量削減のため全てのセクションを1つの無名セグメントにまとめている)
実行ファイルを調べてみると、 __TEXT
セグメントは r-x
, __LINKEDIT
セグメントは r--
, __PAGEZERO
セグメントは ---
のように、適切そうな値が指定されていた。
実験したいこと
maxprotなどの値を7以外に指定したオブジェクトファイルを生成したときに、ちゃんとリンクされるか試す。
Discussion