linux动态链接之.plt与.got.plt

1. 动态链接

一个 main.c 文件

#include 
#include 

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函数

linux动态链接之.plt与.got.plt_第1张图片
跳转到plt节中

在这里插入图片描述
plt节再跳转到got.plt节中
linux动态链接之.plt与.got.plt_第2张图片
这里got.plt中没有函数地址,那么再跳回plt节,然后plt进行解析获取真实地址,得到真实地址后写入got.plt表中
linux动态链接之.plt与.got.plt_第3张图片

当第二次调用puts函数时
linux动态链接之.plt与.got.plt_第4张图片
去到plt节
linux动态链接之.plt与.got.plt_第5张图片
可以发现plt再去got.plt节时就是直接去puts函数本体执行了

你可能感兴趣的:(linux,网络安全,系统安全)