Published on

x86动态链接原理

Authors
  • avatar
    Name
    wellsleep (Liu Zheng)
    Twitter
after_assem_before_run

第二步:当程序第一次运行,调用puts函数时,会首先默认到编译时定好的PLT表的0x80482b0寻找,接着跳到编译时定好的GOT表的0x80486f8处,发现该内存位置填的是PLT的地址,而不是0xF7开头的逻辑内存地址。因此链接器知道puts乃至libc都还没有被加载到内存中。因此顺着此时GOT表中的0x80482b6的地址,回到PLT表,把0x0的这个偏移(相对于GOT表头)压栈后,跳到PLT表头。 这个过程可以用如下伪代码表示:

load_func( (int*)GOT_Base_Addr, (int)func_offset )
run_time
2nd_run