GDB如何知道函数的长度?

时间:2012-10-16 15:15:52

标签: linux gdb elf

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    

然后我删除了两个字节(在程序清单的前面):

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

即。 GDB认为整体长度仍然相同。我想知道GDB是如何做到的。

该文件是以下类型:a.out:ELF 64位LSB可执行文件,x86-64,版本1(SYSV),动态链接(使用共享库),未剥离 仅使用“gcc”创建,没有任何参数。

1 个答案:

答案 0 :(得分:8)

  

GDB采用什么方法来确定函数的长度?

它位于ELF符号表(.st_size成员)中。您可以使用readelf -s a.out | grep main

查看