免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3199 | 回复: 2
打印 上一主题 下一主题

[C] 动态链接如何获得共享库函数地址(位置无关代码) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-14 20:05 |只看该作者 |倒序浏览
请问这么一个问题,困扰了我很久很久。csapp第7章讲链接的时候讲到了PIC函数调用问题(中文版p472),代码如下:
#include <stdio.h>
#include "vector.h"

int x[2] = {1, 2};
int y[2] = {3, 4};
int z[2];

int main()
{
addvec(x, y, z, 2);
printf("z = [%d %d]\n", z[0], z[1]);
return 0;
}
然后这个程序运行的时候有自己的GOT和PLT,如
0x8049684 GOT[4] 0804846a PLT[2]中push1的地址(addvec),这是addvec对应的GOT内容,他的PLT比较长就不列出了。
PLT[2] <addvec>
8048464 jmp 0x8049684(GOT[4])
当addvec第一次被调用时,转到PLT[2]第一条指令,通过GOT[4]执行一个间接跳转,也就是执行下一条指令push1 addvec_id,讲addvec的ID压入栈中,然后又跳到PLT[0]等等。。。其实就是一个问题,动态链接如何获得addvec函数的地址?

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
2 [报告]
发表于 2012-09-15 22:47 |只看该作者
初始化: GOT.PLT节中,全部GOT[...]均初始化为resolver32这个函数的绝对地址。 resolver32这个函数的输入是一个地址未知的symbol;其功能是查找到这个symbol的绝对地址;而且这个函数没有返回,本应该返回时,它会修改GOT[x]里的地址值,然后直接跳转到GOT[x]里的地址值。

第一次addvec : 跳转至PLT2,PLT2处的第一条指令是跳转至GOT[4]里的地址值。GOT[4]处现在是resolver32的绝对地址,故通过resolver32找到addvec的绝对地址,将addvec的绝对地址填写至GOT[4],然后直接跳转到addvec。

第二次addvec : 跳转至PLT2,PLT2处的第一条指令是跳转至GOT[4]里的地址值。GOT[4]处现在是addvec的绝对地址,故一切正常运行

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
3 [报告]
发表于 2012-09-18 22:06 |只看该作者
回复 2# 塑料袋


    顶垃圾袋.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP