动机:
我想在我的 arch(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
,但要填充到限制大小,还远远不够。我可以想到两种方法:
- 使用像 emacs 这样不错的编辑器来生成更多这样的功能
- 使用一个像样的代码生成器在预处理时生成这样的代码,比如宏(但我找不到宏的解决方案)
当然,可能还有更多方法可以实现这一目标。
问题:
如何达到全局偏移表的极限?