最小の実行ファイルを眺めてみる
実行ファイルを自力で生成するのは全プログラマの夢だと思う(要出典) ELFを生成すればいいのだが、そこそこ複雑な上種類も割とあってしんどい 天才であれば仕様書眺めただけでコンパイラを作成できるのだろうが、僕は凡人なのでコンパイラの出力を眺めることにする
実行ファイルを出力するだけならコンパイラは別に必要はないので今回は使わない
code:exit.s
.globl _start
_start:
movq %rax, %rdi
movq $60, %rax
syscall
実はプログラムの実行時、mainは直接呼ばれていない
本来であれば_startの中でスタック領域に書き込まれた引数等をレジスタに置き直したりしているが今回は本筋ではないのでやらない
それぞれasとld(実体はld.bfdだが普通の環境だとldにリンクされている) _startは.textセクションに属することがわかる
適当なツールでダンプするとこのバイナリは0x40に配置されていることがわかる objdump -x exit.oをするとセクションヘッダをダンプしてくれる。
.textのFile offは00000040になっており上のダンプ結果と一致していることがわかる
ld -static -o exit exit.oを実行する
objdump -d exitをすると.textセクションの位置が401000に移っているのがわかる(環境によって違うかもしれない)
objdump -x exitのStart Addressも0x0000000000401000になっている
プログラムヘッダーの二つ目のvaddrも0x0000000000401000になっている
適当なツールでダンプしてみるとファイル上の位置も0x1000に移っているのがわかる
これもプログラムヘッダーの二つ目のoffやセクションヘッダーのFile offと一致している