ダウンロードとインストール
bff-mac-os - Fast brainfuck interpreter - Google Project Hosting
- Bffファイルをダウンロードします
- Bffファイルをパスの通ったディレクトリに配置します
- Bffファイルのパーミッションを755とかにします
以上。
hello world
こんな感じです。
Bff hello.b Hello, world!%
bff-mac-os - Fast brainfuck interpreter - Google Project Hosting
以上。
こんな感じです。
Bff hello.b Hello, world!%
標準パッケージには C、C++、Objective-C、Objective-C++、Fortran、Java、Ada、Go のコンパイラ並びにこれらのライブラリが含まれている。
Portable Executable
32ビット及び64ビット版のMicrosoft Windows上で使用される実行ファイルのファイルフォーマットを指す
途中ちょくちょくEmacsが落ちる。(Windows7)
DOSと混在して実行される場合があるので、頭に This program cannot be run in DOS modeって頭につけて、DOSで動かした場合にエラーになるように仕向けてある。
ファイルを見ただけでは何用のファイルか分からない。
40-7F
ファイルの先頭MZ(000)→3C→80からプログラムを読み込む
すべてのOSのバイナリがいきなりreturnして終了できるとは限らない
unused DOSヘッダが8の倍数で収まらなかった場合のときにpaddingで帳尻を合わせている
ヘッダがいろいろあってめんどくさそう(v6はヘッダがすごいシンプルであった)
8バイトのアラインメント
コンピュータなどにおいて、サイズが2バイト・4バイト……のデータが、アドレスが2の倍数・4の倍数……の丁度に位置に来るように調整すること。 それがunused
COFF File HeaderのFieldが不明
Unixシステムで用いられる実行ファイル、オブジェクトファイル、共有ライブラリのファイルフォーマット仕様
PEはCOFFの後継。
シンボル=名前。DLLで関数を動的に読み込むときは名前を持っておかないと呼べない。
32bit版と64bit版でオプショナルヘッダが違う
ファイルヘッダは一緒。
Machine TypesのIMAGE_FILE_MACHINE_AMD64は0x8664で決め打ち。
動的に決められる。IMAGE_SECTION_HEADERはセクションの数だけある。
データがあるならIMAGE_SECTION_HEADERは2つとなり、つまり可変である。
セクション=テキスト+データの他に、いろいろある。デバッグ用セクション、グローバル変数など
セクション名は自由につけられる。
Characteristicsにフラグを立てて、ファイルの属性を決定できる
IMAGE_OPTIONAL_HEADERは固定値
text data bss 各セクションは4KB単位
FileAgnment(512B)
File→Memory
ヘッダを読み込んでメモリに書き込み、必要になった時点でデータをメモリに読み込む。これをオンデマンドページングというが、それを実現しやすくするためにデータをアラインメントしている。
これはCOFFにはなくって、COFFを拡張したもの。
(仮想マシンかどうかをチェックしている)
ImageBase 先頭のアドレスの場所。そこから相対アドレスでBaseOfCodeとかBaseOfDataのアドレスの場所が指定されている。
RelativeVirtualAddress
相対仮想アドレス(RVA)は、標準的な仮想アドレスと混同してはならない。相対仮想アドレスはメモリにロードされたオブジェクトの仮想アドレスから、ファイルイメージのベースアドレスを引いたものである。
別にF#じゃなくてもよくって、
この2点が満たされればたぶんRubyでもC++でも一向に構わない。
$ gcc makeexec.c $ ./a.exe $ ./test.exe
$ objdump -d a.out
$ objdump -h a.exe
$ objdump -x a.exe
型 | 長 | 備考 |
---|---|---|
BYTE | 1 | バイト |
WORD | 2 | ワード |
DWORD | 4 | ダブルワード |
QWORD | 8 | クアッドワード |
LONG | 4 | ロング |
LONGLONG | 8 | ロングx2 |
ULONGLONG | 8 | Unsigned(符号なし)ロングx2 |