http://shinh.skr.jp/binary/hello_macho.s
PPC で 248Byte 。でけええ。先人の作業を参考にしたりパクリつつ。特に作るプロセスは textEx を使わせていただいています。
http://d.hatena.ne.jp/shotaro_tsuji/20061220/1166610321
http://d.hatena.ne.jp/shotaro_tsuji/20061219/1166458799
http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20061114#t
でかい理由は PPC にレジスタが多すぎるから。まさかレジスタが多いことに不満を言う日が来るとは思わなかったよ。えーと何? 40本レジスタあるんだ。それでそれぞれの初期値指定しないといけないんだ、ふーんじゃあそれだけで 160B かい?というような。
otool -l でロードコマンドをダンプすると、
ux103$ otool -l a.out
a.out:
Load command 0
cmd LC_SEGMENT
cmdsize 44 Inconsistent size
segname Hello, world!
vmaddr 0x00000000
vmsize 0x00001000
fileoff 0
filesize 244
maxprot 0x00000007
initprot 0x00000005
nsects 176
flags 0x1
... nsects の部分はオーバーラップしてるのでこっから壊れてるセグメントの名前が "Hello, world!" 。あとレジスタ指定する空間にコードは埋めてます。結局、 28B の Mach-O ヘッダ、 44B (本来は56B指定しないといけないけど重ねた) の LC_SEGMENT ロードコマンド、最後に LC_UNIXTHREAD ロードコマンドがあるんだけど、これが計 176B 。最初の 16B がヘッダ、んで 160B のレジスタ指定する場所。その 160B に余裕でコード埋まるのでそれで終了。コード自体もレジスタの初期値入れられるとかで微妙に縮むので縮めてあります。
縮む方法があるとすると、 UNIXTHREAD 以外のもっと短いロードコマンドタイプがあるか調べてみるとか、 UNIXTHREAD と SEGMENT の順序入れ替えて重ねてみるとかかと思います。後者はちょっと実験してみた感じ無理な気がしましたが自信無し。