次の関数を検討してください。
extern void test1(void);
extern void test2(void) {
test1();
}
-fpic
これは、 amd64 Linuxなしで gcc が生成するコードです。
test2:
jmp test1
でコンパイルすると-fpic
、gcc は PLT を介して明示的に呼び出し、シンボル挿入を有効にします。
test2:
jmp test1@PLT
ただし、これは位置に依存しないコードには厳密には必要ないため、サポートしたくない場合は省略できます。必要に応じて、リンカはジャンプ ターゲットを PLT シンボルに書き換えます。
ソース コードを変更したり、コンパイルされたコードを共有ライブラリに適さないものにしたりせずに、PLT を明示的に経由する代わりに、関数呼び出しをターゲットに直接送るにはどうすればよいでしょうか?