🍎

Mach-Oのsegmentコマンドのmaxprot, initprotフィールドについて

2021/05/01に公開

どういう記事か

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