为什么gdb显示的函数地址和nm不一样?

今天在linux上调试代码的时候,突然发现里面的函数地址gdb 和什么不一样纳米 显示。 (可执行文件是静态链接的。)

我认为它们显示的地址应该是相同的,因为它们都是逻辑地址。但是今天的发现让我很困惑。

有人知道他们不同的原因吗?

我编写了以下简单程序来说明我遇到的情况。

void fo()              
{                      
    return ;           
}                      


void foo()             
{                      
    fo();              
}                      

int add(int a, int b)  
{                      
    foo();             
    return  a + b;     
}                      

int main()             
{                      
    int a = 1;         
    int b = 2;         
    add(a, b);         

    return 0;          
}                 

nm输出是:

0000000000400584 T _Z2fov
0000000000400595 T _Z3addii
000000000040058a T _Z3foov
00000000004005b3 T main

但是当我使用 gdb 调试编译后的可执行文件时,将断点放在第 3 行。

(gdb) bt
#0  fo () at test.cpp:4
#1  0x0000000000400593 in foo () at test.cpp:9
#2  0x00000000004005a8 in add (a=1, b=2) at test.cpp:14
#3  0x00000000004005d8 in main () at test.cpp:22

你可以看到 gdb 的输出与nm的不同 .

原因:

因为 nm显示函数开始的地址,而gdb堆栈跟踪显示函数内部执行的确切位置。确切地说,它应该是堆栈帧中的返回地址,即当堆栈中位于其上方的函数返回时,指向该函数中要执行的下一条指令的指针。

请注意,如果您只是询问 gdb对于通过评估函数指针表达式的函数指针,它应该给出与 nm 相同的地址.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值