1. 动态链接
一个 main.c
文件
#include <stdio.h>
#include <stdlib.h>
int main()
{
puts("123");
puts("456");
return 0;
}
此时我们编译它默认会使用动态链接默认生成a.out可执行文件
gcc main.c
当第一次调用puts函数时,会去往.plt
节,该节属于代码段
到.plt
节后,会再去到got.plt中查找是否有对应的函数地址,如果没有那么再返回到plt节中进行符号解析
解析成功将puts的真实地址写入到got.plt表中
此后再次调用puts函数时,便直接通过plt表,然后plt在去got.plt查询函数的真实地址并跳到函数体中执行该函数
.plt与.got.plt
这里使用pwngdb进行调试
第一次运行到puts函数
跳转到plt节中
plt节再跳转到got.plt节中
这里got.plt中没有函数地址,那么再跳回plt节,然后plt进行解析获取真实地址,得到真实地址后写入got.plt表中
当第二次调用puts函数时
去到plt节
可以发现plt再去got.plt节时就是直接去puts函数本体执行了