第12回 Universal Binary【前編】Undocumented Mac OS X(4/5 ページ)

» 2007年11月30日 00時20分 公開
[白山貴之,ITmedia]

segmentとsection

 実行ファイル中のデータ領域は、見た目には何の区切りも構造もない。しかし、Load Commandsを見ると幾つかの領域に区分けされているのが分かる。segmentとsectionはその区分けの単位だ。segmentはメモリにマップするときに使用する単位であり、1つないし複数のsectionを内包している。sectionは使用目的ごとに区分けされた領域である。

 例えば、__TEXTというsegmentには、「__TEXT,__text」と「__TEXT,__cstring」という2つのsectionがある。この2つのsectionは__TEXTセグメントとしてまとめてメモリ上にマップされる*が、それぞれ役割が異なり前者のsectionはCPUによって実行されるコードが、後者のsectionには文字列定数が格納されている。

 Load Commandsでは実行ファイルの任意のオフセットを指定でき、原理的には複数のアーキテクチャで同一のsegmentを共有することは可能である。しかし、少なくとも現在のMac OS Xのld*はsegmentやsectionを共有することでファイルサイズを節約するといったことはせず、アーキテクチャにかかわらず同じデータでもCPUの種別ごとに毎回segment、sectionを作成し格納している(実行例4)


% cat main.c
#include <stdio.h>

int main() { printf("hello, world\n"); } % grep -abc "hello, world" a.out 2
実行例4 データはアーキテクチャごとに保存される。main関数に文字列定数「hello, world\n」を持つコードをUnivarsal Binaryとしてコンパイルし、生成されたa.outに対してこの文字列定数をgrepしてみると、1つではなく2つあるのが分かる

このページで出てきた専門用語

まとめてメモリ上にマップされる

マップはあくまでディスク上のセクタと仮想メモリ上のアドレスを関連づけるだけであり、マップされたからといって実メモリに即ロードされるわけではないことに注意。また、仮想メモリのページングはこのsegmentやsectionといった区分に関係なく、PowerPCなら4KB、x86なら8KBの固定サイズのページごと行われる。

Mac OS Xのld

CコンパイラとしてはGCCを、アセンブラとしてはgasを利用しているが、ldだけはbinutilsのldではなくMach由来のldを利用している。これは、Mach-OやMAB(Universal Binary)を正しく扱うためだ。


関連キーワード

Mac | Mac OS X | x86 | Apple | WWDC


Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ