- 论坛徽章:
- 0
|
请问这么一个问题,困扰了我很久很久。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函数的地址? |
|