无法调试GOT表延迟解析:条目在首次调用前已完成解析
问题:GOT表解析流程未触发,GOT条目提前被填充
我编写了一个调用动态库的小程序,目的是跟踪GOT表的解析过程。当调用_print_string时,程序进入了PLT的以下代码段:
0x0000555555555030 ? jmp *0x2f8a(%rip) # 0x555555557fc0 <_print_string@got.plt> 0x0000555555555036 ? push $0x0 0x000055555555503b ? jmp 0x555555555020
按照预期,第一次执行时应该通过第一条jmp指令跳转到push $0x0所在的代码,触发动态链接器解析_print_string的实际地址,但逐行调试时发现GOT表中已经提前存储了_print_string的正确地址。我使用GDB在_print_string@plt处设置断点并运行程序,确认使用的是共享库而非静态库。
补充1:主函数汇编代码(x86-64 AT&T格式)
仅粘贴到函数调用部分:
.global main .type main function main: push %rbp mov %rsp, %rbp push %rdi # argc (%rbp - 8) push %rsi # argv (%rbp - 16) push $0 # index (i) (%rbp - 24) leaq nargsmsg(%rip), %rdi call _print_string
补充2:puts的GOT条目提前解析示例
.global main .type main function .text main: push %rbp mov %rsp, %rbp leaq string(%rip), %rdi call puts mov $0, %rax leave ret .data string: .asciz "Hello world\n"
补充3:已尝试的排查操作
- 曾使用gdb-dashboard,禁用后问题仍存在
- 用
-z norelro参数编译,通过checksec验证该选项已生效 - 检查环境变量
LD_BIND_NOW,确认未定义
但以上操作后,问题依旧存在。
内容的提问来源于stack exchange,提问作者DrStein
相关产品推荐
相关产品推荐

