以下dynamic linkのときの話.

Preliminaries

セクション: 静的リンカーのための概念

セグメント: 動的リンカーやプログラム実行時の概念

.pltセクションは実行可能なセクションになっている.

.gotはよくわからん.

.got.pltは関数のアドレスだけが書いてある.

libcの関数のアドレス解決

libcの関数のアドレス解決を必要なときに解決するためにある.(遅延バインディング)

例えばlibcのputs関数を呼ぶ際には.pltセクションにあるputs@pltをcallする.

puts@pltは.got.pltに書いてあるアドレスにjmpするだけ.

もし解決されていれば.got.pltにはlibcのputs関数のアドレスが書いてあるのでputs関数が呼ばれる.

まだ未解決の場合には「アドレス解決するための関数」のアドレスが書いてあるので,

そこにjumpして.got.pltが書き換えられることになる.