文章目录
一、GOT 表数据结构分析
二、函数根据 GOT 表进行跳转的流程
一、GOT 表数据结构分析
GOT 表分为 2 22 部分 ,
一部分在 调用者部分 ( 可执行文件 ) 中 ,
一部分在 被调用者部分 ( 静态 / 动态 函数库 ) 中 ;
在 函数库 中的部分是真正的 GOT 表 , 在调用者的部分是 PLT 表 ;
PLT 表示一个 跳转指令列表 , 执行该跳转指令 , 可以直接跳转到对应的 GOT 表中 , GOT 表记录 函数真实的位置 , 此时可以 跳转到 函数真实位置 ;
GOT 表在动态库中是以数组形式存在的 , 其中的数据结构很负责 , 不只是有 函数地址 , 还有其它额外数据信息 ;
二、函数根据 GOT 表进行跳转的流程
函数跳转流程 :
PLT 表中 保存的是 jmp 指令 , 该指令跳转的目的地址是 动态库 中的 GOT 表 , GOT 表中记录了真实的被调用函数的地址 , 之后直接跳转到该 真实函数地址 中 ;
以访问 scanf 函数为例 : 在 PLT 表中 , 保存的是 jmp GOT表地址 指令 , GOT 表地址 指向 GOT 表的一个数组元素 , 该数组元素存储这 scanf 函数的实际地址 , 因此该 GOT 表地址 本质 是 保存 scanf 函数的地址 的 数据 的 地址 ; GOT 表 是 libc.so 中的 ;