GDB采用什么方法来确定函数的长度?我注意到在从main()中删除了两个字节后,GDB认为该函数仍然是原始长度,所以我假设它使用了一些调试信息?
特别是,main()的结尾最初是:
0x00000000004005a1 <+133>: mov edi,0x4006ac
0x00000000004005a6 <+138>: call 0x4003a0 <puts@plt>
0x00000000004005ab <+143>: mov eax,0x0
0x00000000004005b0 <+148>: leave
0x00000000004005b1 <+149>: ret
Run Code Online (Sandbox Code Playgroud)
然后我删除了两个字节(在程序清单的早期):
0x000000000040059f <+131>: mov edi,0x4006ac
0x00000000004005a4 <+136>: call 0x40039e
0x00000000004005a9 <+141>: mov eax,0x0
0x00000000004005ae <+146>: leave
0x00000000004005af <+147>: ret
0x00000000004005b0 <+148>: nop
0x00000000004005b1 <+149>: nop
Run Code Online (Sandbox Code Playgroud)
即GDB认为整体长度仍然相同.我想知道GDB是如何做到这一点的.
该文件是以下类型:a.out:ELF 64位LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),未剥离仅使用"gcc"创建,没有参数.