linux plt 的实现

linux plt 的实现,第1张

以write函数为例说明延迟绑定,如上图所示,当第一次调用write函数时候,程序会跳转到.plt表处

程序首先会跳转到0x601018处,我们看一下0x601018是什么

0x601018是一个地址,这个地址就是jmp命令的下一条指令的地址。因为是第一次第一次调用,此时got还没有添加write函数的实际地址。当重定位完成之后就不会执行0x400586处的指令了。

0x601010处存放的是一个地址即7ffff7dee6a0,这个地址是dl_runtime_reslove函数的地址。

所以重定位最终是调用dl_runtime_reslove函数去解析write函数的实际地址,解析成功将地址保存到.got.plt表中。以后在调用write函数流程就变为plt->got。

dl_runtime_reslove函数确定符号的过程如下:

根据rel_offset,找到重定位条目:

根据rel_entry中的符号表条目编号,得到对应的符号信息:

再找到符号信息中的符号名称:

获取符号对应的字符串仅仅是一小部分,具体的地址获取与link_map的实现息息相关,即压入堆栈的另一个参数,这一部分的原理与实现参考 此文

不是。JMP文件可以在移动和桌面平台上找到,可以在Windows和Linux中打开,jmp文件打开不是只有window能用。JMP文件是数据文件,该方案JMP创建的。JMP是一个程序,让用户直观地了解了使用SAS软件创建的统计信息。

nasm对跳转的设计很人性化.一般来说nasm中跳转标明长度就可以了.在实模式跨入保护模式的那条经典jmp中,Linux的代码是直接编的机器码,nasm加一个dword就可以了.如果jmp这种方法解决不了的话,你可以试一试把地址压栈,然后执行一个retf就可以了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7193450.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存