哪里有做网站的平台,惠州网站建设服务,模板设计模式,怎么样把网站做火linux调用共享库中的函数时通过plt表和got表实现位置无关代码#xff0c;过程中涉及到lazy binding#xff0c;即在第一调用外部函数时解析被调用的函数地址并将地址写入到got表#xff0c;后续调用则不需要解析函数地址#xff0c;具体过程如下
1.c程序如下
#include 过程中涉及到lazy binding即在第一调用外部函数时解析被调用的函数地址并将地址写入到got表后续调用则不需要解析函数地址具体过程如下
1.c程序如下
#include stdio.h
#include cstub.h
#include dlfcn.h
extern void a();
int main()
{a();int i1;
}2.c程序文件如下
#include stdio.hvoid a()
{void *b printf;printf(hahahaha\n);
}编译参数如下
gcc -g 1.c -I. -L. -la -ldl -z lazy
gcc -g -fPIC -shared 2.c -o liba.so
使用gdb调试a.out在main上下断点反汇编main函数如下 可以看出程序时通过0x401030这个地址来调用a函数反编译0x401030如下 0x401030这个地址反编译对应着plt表jmpq *0x2fe2(%rip) 是 x86-64 架构中的一条跳转指令。我们来逐部分分析这条指令的含义 jmpq: 这是一个跳转指令jmp 表示无条件跳转jumpq 表示这是一个 64 位的跳转quad 的缩写。 0x2fe2(%rip): 这里使用的是相对寻址模式%rip 是指令指针寄存器Instruction Pointer Register它指向当前正在执行的指令的地址。0x2fe2 是一个偏移量表示从当前指令的地址向前或向后偏移 0x2fe2 字节。也就是说0x2fe2(%rip) 将计算出一个地址这个地址是当前指令地址加上 0x2fe2。 *0x2fe2(%rip): 星号*表示将这个计算出的地址作为跳转目标而不是直接跳转到一个固定的地址。也就是说指令会跳转到由 0x2fe2(%rip) 指向的地址。 使用x读取这个地址内容发现对应应位置是got表内容值未0x401036对应着上图pushq这条汇编指令即程序执行完plt表第一条jumq后紧接着执行pushq %0jump 0x4010200x401020保存了解析a函数地址的代码。 执行r命令并执行到int i1这行代码此时程序执行完a函数并输出再次查看got表内容可以发现got表对应的值改变为0x00007ffff7fcb105反汇编a函数可以看出a函数的地址也为0x00007ffff7fcb105因此后续在调用a函数是程序通过jmpq *0x2fe2(%rip) 这句指令跳转到a函数真实地址并执行a函数。