- 論壇徽章:
- 0
|
請問這么一個問題,困擾了我很久很久。csapp第7章講鏈接的時候講到了PIC函數(shù)調(diào)用問題(中文版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對應(yīng)的GOT內(nèi)容,他的PLT比較長就不列出了。
PLT[2] <addvec>
8048464 jmp 0x8049684(GOT[4])
當(dāng)addvec第一次被調(diào)用時,轉(zhuǎn)到PLT[2]第一條指令,通過GOT[4]執(zhí)行一個間接跳轉(zhuǎn),也就是執(zhí)行下一條指令push1 addvec_id,講addvec的ID壓入棧中,然后又跳到PLT[0]等等。。。其實就是一個問題,動態(tài)鏈接如何獲得addvec函數(shù)的地址? |
|