-1

動機:

アーチ (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 を使用して、マクロのように前処理時にそのようなコードを生成します (ただし、マクロで解決策を見つけることができません)

もちろん、この目標を達成する方法は他にもあるかもしれません。

質問:

グローバル オフセット テーブルの制限に到達するにはどうすればよいですか?

4

1 に答える 1