動機:
アーチ (x86) でグローバル オフセット テーブルの gcc の制限サイズをテストしたいと考えています。
私がやった事:
共有ライブラリで宣言されていない複数の関数を使用する ( gcc -nostdlib -shared -o got.so ./got.c
)
// got.c
extern int itestvariable1;
extern int testvariable2;
void test(void)
{
fun1();
...
fun8();
}
とreadelf --relocs ./got.so
:
Relocation section '.rela.plt' at offset 0x3a8 contains 8 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000004018 000100000007 R_X86_64_JUMP_SLO 0000000000000000 fun7 + 0
000000004020 000200000007 R_X86_64_JUMP_SLO 0000000000000000 fun3 + 0
000000004028 000300000007 R_X86_64_JUMP_SLO 0000000000000000 fun4 + 0
000000004030 000400000007 R_X86_64_JUMP_SLO 0000000000000000 fun8 + 0
000000004038 000500000007 R_X86_64_JUMP_SLO 0000000000000000 fun2 + 0
000000004040 000600000007 R_X86_64_JUMP_SLO 0000000000000000 fun6 + 0
000000004048 000700000007 R_X86_64_JUMP_SLO 0000000000000000 fun1 + 0
000000004050 000800000007 R_X86_64_JUMP_SLO 0000000000000000 fun5 + 0
......
上記のように、グローバル オフセット テーブルは で埋められてfun1-8
いますが、制限サイズに達するには十分ではありません。次の 2 つの方法が考えられます。
- これらのようなより多くの関数を生成するには、emacs のような適切なエディターを使用してください
- 適切な codegen を使用して、マクロのように前処理時にそのようなコードを生成します (ただし、マクロで解決策を見つけることができません)
もちろん、この目標を達成する方法は他にもあるかもしれません。
質問:
グローバル オフセット テーブルの制限に到達するにはどうすればよいですか?